[솔리디티, 메타마스크] 프로바이더와 사이너

Bora Lee
3 min readOct 31, 2023

--

dApp(Decentralized Application) 구축 등의 Web3 클라이언트 프로젝트를 만들려면 ethers.js나 web3.js를 사용하게 되는데, 이때 코드에서 프로바이더(provider)와 사이너(signer)를 보게 된다. 이 두 가지 개념의 차이에 대해 알아보자.

const getProviderOrSigner = async (needSigner = false) => {
const provider = await web3ModalRef.current.connect();
const web3Provider = new providers.Web3Provider(provider);

const { chainId } = await web3Provider.getNetwork();
if (chainId !== 4) {
window.alert("Rinkeby 테스트넷을 사용해주세요.");
throw new Error("Rinkeby 테스트넷을 사용해주세요.");
}

if (needSigner) {
const signer = web3Provider.getSigner();
return signer;
}
return web3Provider;
};

프로바이더

이더리움 블록체인에 데이터를 쓰거나 읽으려면 블록체인의 상태를 담고 있는 이더리움 노드와 통신해야 한다.

구축 중인 애플리케이션의 유형에 따라 메타마스크 같은 중개자 지갑을 통해 노드에 액세스할 수도, 코드(주로 RPC URL)를 통해 노드에 액세스할 수도있다.

프로바이더는 이더리움 노드의 상태로부터 데이터를 읽을 때 사용한다. 스마트 컨트랙트에서 읽기 전용 함수 호출, 계정 잔액 가져오기, 트랜잭션 세부 정보 가져오기, 최신 블록 번호 가져오기, 특정 NFT의 소유자 가져오기 등은 블록체인에 이미 기록된 정보를 읽는 것이기 때문에 프로바이더만으로 원하는 작업을 수행할 수 있다.

const provider = await getProviderOrSigner();

사이너

사이너는 프로바이더와 유사하지만, 이더리움에 데이터를 쓸 수 있다는 차이점이 있다.

블록에 트랜잭션을 추가하고 싶은 경우, 트랜잭션 추가에 필요한 가스비를 잔액으로 가지고 있는 계정이 필요하다. 그런데 프로바이더는 연결된 계정이 없으므로 원하는 임무를 수행하지 못한다.

const signer = await getProviderOrSigner(true);

사이너는 프로바이더에 지갑을 더한 개념이다. 이때 지갑은 구축하는 애플리케이션의 유형에 따라 1) 메타마스크 같은 중간 매개가 될 수도 있고, 2) 프라이빗 키를 사용해 연동할 수도 있다.

리믹스에서 메타마스크를 연동하여 사이너 사용
대개 프라이빗키를 사용해 지갑 연동

요약

  • 이더리움 네트워크에 있는 정보를 읽으려면 프로바이더 사용
  • 이더리움 네트워크에 정보를 쓰려면 가스비가 필요하므로 프로바이더에 지갑을 더한 개념인 사이너 사용

작성자: 서강대학교 게임 교육원 이보라 교수

--

--