Provider
는 블록체인에 대한 읽기 전용 연결로, 계정, 블록 또는 트랜잭션 세부 정보와 같은 블록체인 상태를 쿼리하고, 이벤트 로그를 쿼리하거나 호출을 사용하여 읽기 전용 코드를 평가할 수 있습니다.
Web3.js를 사용하신다면 읽기 및 쓰기 액세스를 모두 제공하는 Provider
에 익숙하실 것입니다. 이더리움에서는 모든 쓰기 작업이 다른 객체인 Signer
로 추상화됩니다.
Signer
는 계정과 상호작용하는 모든 작업을 래핑합니다. 계정에는 일반적으로 어딘가에 개인키가 있으며, 이 개인키는 다양한 유형의 페이로드에 서명하는 데 사용할 수 있습니다.
개인 키는 메모리에 위치하거나(Wallet
사용), 웹사이트와 브라우저 플러그인 간의 상호 작용을 프록시하는 메타마스크와 같은 일부 IPC 계층을 통해 보호될 수 있으며, 이 계층은 개인 키를 웹사이트의 손이 닿지 않는 곳에 보관하고 사용자에게 권한을 요청하고 승인을 받은 후에만 상호 작용을 허용합니다.
블록체인의 상태를 변경하려면 Transaction
이 필요하며, Transaction
을 실행하고 업데이트된 정보를 저장하는 데 드는 비용(예: 디스크 읽기 및 연산 수행)을 수수료로 지불해야 합니다.
Transaction
이 되돌려지더라도 검증자가 Transaction
이 되돌려졌는지 확인하기 위해 Transaction
을 실행하는 데 리소스를 소비해야 하고 실패에 대한 세부 정보가 계속 기록되므로 여전히 수수료를 지불해야 합니다.
Transaction
에는 한 사용자에서 다른 사용자로 이더를 전송하거나 Contract
를 배포하거나 Contract
에 대한 상태 변경 작업을 실행하는 것이 포함됩니다.
Transaction
이 블록체인에 제출되면 검증자가 Transaction
을 포함하기로 결정할 때까지 메모리 풀(멤풀)에 배치됩니다.
Transaction
의 변경은 블록체인에 포함된 후에만 가능하며, 이때 Transaction
이 어느 블록에 포함되었는지, 실제 지불한 수수료, 사용한 가스, 발생한 모든 이벤트, 성공 또는 취소 여부 등 Transaction
에 대한 세부 정보가 포함된 영수증을 받을 수 있습니다.
검증자
injected provider
는 브라우저 환경에서 사용할 수 있는 웹3 인터페이스를 제공하는 Provider
입니다. 이를 사용하면 브라우저에 설치된 이더리움 지갑과 같은 프로그램을 통해 계정에 액세스하고 Transaction
을 보낼 수 있습니다.
Injected provider
는 이더리움 블록체인에 대한 일반적인 RPC 엔드포인트와는 달리, 지갑 소프트웨어와 연동하여 사용자의 개인 키를 안전하게 보호하고, 사용자의 계정 및 Transaction
에 대한 권한을 부여받아 보다 안전하고 사용자 친화적인 인터페이스를 제공합니다. 이러한 이점으로 인해 대부분의 DApp은 사용자가 지갑 소프트웨어를 사용하여 DApp에 접속하도록 권장합니다.
Provider
를 사용하여 블록체인에 연결하는 것입니다.이더리움에서 실험하고 개발을 시작하는 가장 빠르고 쉬운 방법은 window
에 객체를 삽입하여 제공하는 브라우저 확장 프로그램인 메타마스크를 사용하는 것입니다. 메타마스크는 다음을 제공합니다:
Provider
)Signer
)Transaction
을 전송하거나 개인 키 주소를 요청하는 등 인증된 방법에 대한 액세스를 요청할 때, 메타마스크는 사용자에게 권한을 요청하는 팝업을 표시합니다.
let signer = null;
let provider;
if (window.ethereum == null) {
// If MetaMask is not installed, we use the default provider,
// which is backed by a variety of third-party services (such
// as INFURA). They do not have private keys installed so are
// only have read-only access
console.log("MetaMask not installed; using read-only defaults")
provider = ethers.getDefaultProvider()
} else {
// Connect to the MetaMask EIP-1193 object. This is a standard
// protocol that allows Ethers access to make all read-only
// requests through MetaMask.
provider = new ethers.BrowserProvider(window.ethereum)
// It also provides an opportunity to request access to write
// operations, which will be performed by the private key
// that MetaMask manages for the user.
signer = await provider.getSigner();
}
소수점과 부동 소수점을 처리하면 수학적 연산을 수행할 때 부정확하고 명확하지 않은 결과가 나올 수 있기 때문에 이더리움의 모든 단위는 정수값을 사용하는 경향이 있습니다.
그 결과, 기계가 읽을 수 있는 목적과 수학에 적합한 내부 단위(예: wei
)는 종종 매우 크고 사람이 읽을 수 없는 경우가 많습니다.
예를 들어 달러와 센트를 거래할 때 "$2.56"
과 같은 값을 표시한다고 상상해 보세요. 블록체인 세계에서는 모든 값을 센트로 유지하므로 내부적으로 256센트
가 됩니다.
따라서 사용자가 입력하는 데이터를 수락할 때는 십진수 문자열 표현(예: "2.56"
)에서 가장 낮은 단위의 정수 표현(예: 256
)으로 변환해야 합니다. 그리고 사용자에게 값을 표시할 때는 반대의 연산이 필요합니다.
이더리움에서 1 ether
는 10 ** 18 wei
, 1 gwei는 10 ** 9 웨이
와 같으므로 값이 매우 빠르게 커지므로 표현 간 변환을 돕기 위해 몇 가지 편의 함수가 제공됩니다.
// Convert user-provided strings in ether to wei for a value
eth = parseEther("1.0")
// 1000000000000000000n
// Convert user-provided strings in gwei to wei for max base fee
feePerGas = parseUnits("4.5", "gwei")
// 4500000000n
// Convert a value in wei to a string in ether to display in a UI
formatEther(eth)
// '1.0'
// Convert a value in wei to a string in gwei to display in a UI
formatUnits(feePerGas, "gwei")
// '4.5'
Provider
가 있으면 블록체인의 데이터에 대한 읽기 전용 연결 권한을 갖게 됩니다. 이를 통해 현재 계정 상태를 쿼리하고, 기록 로그를 가져오고, Contract
코드를 조회하는 등의 작업을 수행할 수 있습니다.
// Look up the current block number (i.e. height)
await provider.getBlockNumber()
// 17079482
// Get the current balance of an account (by address or ENS name)
balance = await provider.getBalance("ethers.eth")
// 182334002436162568n
// Since the balance is in wei, you may wish to display it
// in ether instead.
formatEther(balance)
// '0.182334002436162568'
// Get the next nonce required to send a transaction
await provider.getTransactionCount("ethers.eth")
// 3
블록체인에 쓰려면 계정을 제어하는 개인 키에 대한 접근 권한이 필요합니다. 대부분의 경우 이러한 개인 키는 코드에 직접 액세스할 수 없으며, 대신 Signer
를 통해 요청을 하면 Signer
는 엄격하게 게이트된 액세스를 제공하고 사용자에게 작업 승인 또는 거부를 위한 피드백을 요구하는 서비스(예: 메타마스크)로 요청을 전송합니다.
// When sending a transaction, the value is in wei, so parseEther
// converts ether to wei.
tx = await signer.sendTransaction({
to: "ethers.eth",
value: parseEther("1.0")
});
// Often you may wish to wait until the transaction is mined
receipt = await tx.wait();