[블록체인] Ethers 공부

bluejoy·2023년 5월 14일
0

블록체인

목록 보기
1/1

Ethers

단어

Provider

Provider는 블록체인에 대한 읽기 전용 연결로, 계정, 블록 또는 트랜잭션 세부 정보와 같은 블록체인 상태를 쿼리하고, 이벤트 로그를 쿼리하거나 호출을 사용하여 읽기 전용 코드를 평가할 수 있습니다.

Web3.js를 사용하신다면 읽기 및 쓰기 액세스를 모두 제공하는 Provider에 익숙하실 것입니다. 이더리움에서는 모든 쓰기 작업이 다른 객체인 Signer로 추상화됩니다.

Signer

Signer는 계정과 상호작용하는 모든 작업을 래핑합니다. 계정에는 일반적으로 어딘가에 개인키가 있으며, 이 개인키는 다양한 유형의 페이로드에 서명하는 데 사용할 수 있습니다.

개인 키는 메모리에 위치하거나(Wallet 사용), 웹사이트와 브라우저 플러그인 간의 상호 작용을 프록시하는 메타마스크와 같은 일부 IPC 계층을 통해 보호될 수 있으며, 이 계층은 개인 키를 웹사이트의 손이 닿지 않는 곳에 보관하고 사용자에게 권한을 요청하고 승인을 받은 후에만 상호 작용을 허용합니다.

Transaction

블록체인의 상태를 변경하려면 Transaction이 필요하며, Transaction을 실행하고 업데이트된 정보를 저장하는 데 드는 비용(예: 디스크 읽기 및 연산 수행)을 수수료로 지불해야 합니다.

Transaction이 되돌려지더라도 검증자가 Transaction이 되돌려졌는지 확인하기 위해 Transaction을 실행하는 데 리소스를 소비해야 하고 실패에 대한 세부 정보가 계속 기록되므로 여전히 수수료를 지불해야 합니다.

Transaction에는 한 사용자에서 다른 사용자로 이더를 전송하거나 Contract를 배포하거나 Contract에 대한 상태 변경 작업을 실행하는 것이 포함됩니다.

Receipt

Transaction이 블록체인에 제출되면 검증자가 Transaction을 포함하기로 결정할 때까지 메모리 풀(멤풀)에 배치됩니다.

Transaction의 변경은 블록체인에 포함된 후에만 가능하며, 이때 Transaction이 어느 블록에 포함되었는지, 실제 지불한 수수료, 사용한 가스, 발생한 모든 이벤트, 성공 또는 취소 여부 등 Transaction에 대한 세부 정보가 포함된 영수증을 받을 수 있습니다.

Validator

검증자

Injected Provider

  • 출처 chatgpt

injected provider는 브라우저 환경에서 사용할 수 있는 웹3 인터페이스를 제공하는 Provider입니다. 이를 사용하면 브라우저에 설치된 이더리움 지갑과 같은 프로그램을 통해 계정에 액세스하고 Transaction을 보낼 수 있습니다.

Injected provider는 이더리움 블록체인에 대한 일반적인 RPC 엔드포인트와는 달리, 지갑 소프트웨어와 연동하여 사용자의 개인 키를 안전하게 보호하고, 사용자의 계정 및 Transaction에 대한 권한을 부여받아 보다 안전하고 사용자 친화적인 인터페이스를 제공합니다. 이러한 이점으로 인해 대부분의 DApp은 사용자가 지갑 소프트웨어를 사용하여 DApp에 접속하도록 권장합니다.

이더리움에 연결하기

  • 블록체인과 상호작용을 시작하기 위해 가장 먼저 필요한 것은 Provider를 사용하여 블록체인에 연결하는 것입니다.

MetaMask (and other injected providers)

이더리움에서 실험하고 개발을 시작하는 가장 빠르고 쉬운 방법은 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 ether10 ** 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();
profile
개발자 지망생입니다.

0개의 댓글