[루디움 렉쳐] 이더리움 베이직_kingyoungdae 학습 내용 정리 (트랜잭션 살펴보기)

트랜잭션 살펴보기

1. 트랜잭션이란?


(이미지 출처 - Ethereum Develop Docs, Transactions)

트랜잭션은 EVM의 상태를 변경하여 블록체인에 데이터를 저장하는 행위(Action)로 전체 네트워크에 전파된다. 모든 노드는 EVM에서 실행될 트랜잭션에 대한 요청을 전파할 수 있다. 이후 유효성 검사가 완료되면 트랜잭션을 실행하고 결과 상태 변경을 완료하여 나머지 네트워크에 전파된다.

이더리움에는 몇 가지 다른 유형의 트랜잭션이 있다:

  • 일반 트랜잭션: 한 계정에서 다른 계정으로의 트랜잭션이다.
  • 계약 배포 트랜잭션: '받는 사람' 주소가 없는 트랜잭션으로, 데이터 필드가 계약 코드에 사용된다.
  • 계약 실행: 배포된 스마트 컨트랙트와 상호 작용하는 트랜잭션이다. 이 경우 to 주소는 스마트 컨트랙트 주소이다.

제출된 트랜잭션에는 다음 정보가 포함된다.

  • from – 거래에 서명할 보낸 사람의 주소이다. 컨트랙트 계정은 거래를 보낼 수 없으므로 이는 외부 소유 계정이 된다
  • to – 수신 주소(외부 소유 계정인 경우 거래는 가치를 이전합니다. 계약 계정인 경우 거래는 계약 코드를 실행한다.
  • sign – 보낸 사람의 식별자이다. 이는 보낸 사람의 개인 키가 거래에 서명하고 보낸 사람이 이 거래를 승인했음을 확인할 때 생성된다.
  • nonce - 계정의 거래 번호를 나타내는 순차적으로 증가하는 카운터이다.
  • value – 발송인에서 수취인에게 전송할 ETH의 양(WEI로 표시, 1ETH는 1e+18wei와 같음)이다
  • input data – 임의의 데이터를 포함하는 선택적 필드이다
  • gasLimit – 거래에서 소비할 수 있는 최대 가스 단위이다. EVM은 각 계산 단계에 필요한 가스 단위를 지정한다.
  • maxPriorityFeePerGas - 검증자에게 팁으로 포함될 소비된 가스의 최대 가격이다
  • maxFeePerGas - 거래에 대해 지불할 의사가 있는 가스 단위당 최대 수수료(baseFeePerGas  maxPriorityFeePerGas 포함)이다

아래는 트랜잭션의 예시이다:

복사
{
  from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
  to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
  gasLimit: "21000",
  maxFeePerGas: "300",
  maxPriorityFeePerGas: "10",
  nonce: "0",
  value: "10000000000"
}

트랜잭션이 전송되기 위해서는 발송인(Sender)의 서명이 포함되어야 한다. 이를 통해 트랜잭션이 거짓된 내용이 아니라 특정 발송인으로부터 온 것임을 증명할 수 있다. 서명 과정은 Geth와 같은 이더리움 클라이언트에서 처리한다.

JSON-RPC로 호출한 트랜잭션의 예시이다:

복사
{
  "id": 2,
  "jsonrpc": "2.0",
  "method": "account_signTransaction",
  "params": [
    {
      "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
      "gas": "0x55555",
      "maxFeePerGas": "0x1234",
      "maxPriorityFeePerGas": "0x1234",
      "input": "0xabcd",
      "nonce": "0x0",
      "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
      "value": "0x1234"
    }
  ]
}

응답 예시이다:

복사
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
    "tx": {
      "nonce": "0x0",
      "maxFeePerGas": "0x1234",
      "maxPriorityFeePerGas": "0x1234",
      "gas": "0x55555",
      "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
      "value": "0x1234",
      "input": "0xabcd",
      "v": "0x26",
      "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",
      "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
      "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"
    }
  }
}

서명 해시가 있어야 트랜잭션이 발송인로부터 네트워크에 제출되었음을 암호학적으로 증명할 수 있다.

트랜잭션 라이프사이클

이더리움 네트워크에 제출된 트랜잭션은 다음의 과정을 거친다:

  1. 암호화된 트랜잭션 해시를 생성한다:
    0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. 트랜잭션이 전파되어 트랜잭션 풀(멤풀)에 저장된다. 트랜잭션 풀에는 아직 네트워크에서 "처리 중(Pending)"인 트랜잭션이 저장된다.
  3. 벨리데이터가 트랜잭션을 선택하여 블록에 저장한다. 이 때 트랜잭션이 "성공적(successful)" 상태로 변한다.
  4. 이후 트랜잭션이 "인정됨(Justified)"에서 "완료됨(Finalized)" 상태로 변한다. 상태의 변화는 블록이 더 이상 변하지 않을 것이며 "완료된" 트랜잭션의 변경이 없을 것임을 의미한다.

2. 이더스캔(Etherscan)으로 트랜잭션 살펴보기

이번 장에서는 이더스캔 사이트를 통해 트랜잭션을 자세히 살펴보자. 이더스캔은 블록 검색기(Block Explorer)로, 이더리움 네트워크에서 일어나는 모든 활동들을 탐색할 수 있는 사이트이다.

스마트 컨트랙트의 상태, 실행된 트랜잭션, 코드 등에 대한 정보를 제공한다. 즉 이더스캔은 스마트 컨트랙트의 활동을 탐색하거나, 스마트 컨트랙트가 상호작용하는 트랜잭션을 확인할 수 있도록 도와준다.

이더스캔은 개발자에게 있어서도 중요한 역할을 하는데 페이지의 구성을 천천히 살펴보자.

Etherscan 페이지 구성

상단의 검색 부분에서는 Address, Txn(Transaction) Hash, Block, Token, Domain Name 등 내가 찾고자 하는 특정 분야를 한 번에 찾을 수 있다.

특정 주소, 특정 서비스 등이 이더리움 네트워크에서 어떤 활동을 하고 있는지 검색해서 한 번에 볼 수 있다.

ETHER PRICES - 현재 이더리움의 가격을 나타낸다.

TRANSACTIONS - 전체적으로 이더리움 네트워크에서 발생한 트랜잭션의 총 수를 나타내고, MED GAS PRICE는 이더리움 가스비의 중앙값이다.

MARKET CAP - Market CAP은 Market Capitalization의 약자로, 이더리움의 시가총액입니다. 이더리움의 현재 시장 가격과 유통 중인 이더리움의 총 개수를 곱한 값이다.

LAST FINALIZED BLOCK - 최근에 확정된 블록을 나타낸다. 블록은 바로바로 합쳐지는 것이 아닌 네트워크에서 여러 Validator들에 의해 해당 블록의 유효성을 검증하는 과정을 거치게 되는데 이 과정이 통과되어야만 블록에 합쳐지기 때문이다. 즉 이 과정을 통해 블록의 보안성과 안정성을 나타낼 수 있다.

LAST SAFE BLOCK - 이더리움 블록체인 상에서 안전하게 사용될 수 있는 블록을 가리킨다. 블록체인 네트워크 상에서는 동일한 블록에 대해 서로 다른 의견을 가지고 나뉠 수 있는 ‘분기’가 발생할 수 있다. 이로써 2개 이상의 분기점을 가질 수도 있는데, 이는 블록체인의 일관된 상태를 해칠 수 있다. LAST SAFE BLOCK을 통해 분기 현상 이후의 어떤 분기점의 블록을 사용해야 하는지에 대한 지표가 된다.

Latest Blocks

이더리움 네트워크에서 발생되는 실시간 블록을 보여주는 곳이다. 실시간으로 갱신되니 페이지를 새로고침 할 때마다 새로운 블록들이 줄줄이 이어진다.

위에서 Fee Recipient beaverbuild, Titan Builder 등등이 적혀있는데, Fee Recipient <주체>는 수수료를 받는 주체가 된다. 사용자가 트랜잭션을 실행할 때 해당 거래를 처리하는 노드나 서비스 제공자에게 제공되는 수수료이다. 또한 우측에는 얼마의 거래 수수료를 받았는지까지 적혀있다.

Latest Transactions

특정 주소나 계정에서 발생한 최신 트랜잭션들을 보여주는 곳이다. 이것도 Latest Blocks와 마찬가지로 페이지를 새로고침하면 새로운 트랜잭션 리스트들을 볼 수 있다.

From 주소 > To 주소에게로 나타나있는데, From의 주체가 To 목적지에게 얼마만큼의 Eth를 보냈는지에 대해 간략하게 나와 있다.

거래 하나를 눌러 어떤 식으로 보냈는지에 대해 상세정보를 살펴보자.

Transaction Detail 페이지에서는 아래와 같이 트랜잭션의 세부적인 정보를 볼 수 있다.

Transaction Hash는 이 트랜잭션의 고유한 해시값이다. 이 트랜잭션에 대해 특정 번호가 붙었다고 생각하면 된다.

19996919번째의 블록에 이 트랜잭션이 포함되어 있으며, Timestamp를 통해 6분 전에 이 블록이 생성되었다는 것을 확인할 수 있다.

Transaction Action의 경우 이 트랜잭션이 어떤 행동을 했느냐를 나타내는데 Transfer(이더리움 송금)을 했다는 것을 확인할 수 있다. 송금한 가격은 0.393731~ ETH로 Value에서 확인할 수 있다.

Transaction Fee는 이 트랜잭션을 블록체인 네트워크에 제출할 때 지불해야 하는 수수료를 의미하며, 이 트랜잭션을 처리하여 블록을 포함시키는 Minor에게 그 보상이 지급된다.

Gass Price는 이 트랜잭션을 처리하는데 지불된 이더리움 Gas의 가격을 의미한다. Gwei(Gigawei의 약자로, 10억 개의 Wei 단위를 나타냅니다)라는 단위로 표현되며 Gas Price가 높을수록 더 빠른 트랜잭션 처리가 되며 더 높은 수수료를 지불해야 한다.

3. 이더스캔에서 컨트랙트 검증하고 퍼블리시 하기

Etherscan을 통해 개발자는 자신의 스마트 컨트랙트 코드를 Verify 하는 과정 또한 중요하다. 이 챕터에서는 실습을 다루지는 않지만, 과정을 소개하고자 한다.

개발자가 자신의 스마트 컨트랙트 코드를 이더리움 네트워크 상에 배포를 했다면(Holesky, Sepolia 등의 테스트넷에서도 가능하다) 해당 컨트랙트의 주소를 찾아 contract에서 Verify & Publish를 한다. 그런 다음, remix에서 해당 컨트랙트의 파일을 flatten(여러 곳에 분산되어 있는 solidity 소스 코드를 하나의 파일로 병합) 한 후 Etherscan에서 Verify & Publish가 가능하다.

이 과정을 통해 스마트 컨트랙트의 투명성을 확보하여 신뢰성을 높일 수 있으며, 다른 개발자들도 해당 코드를 참고하여 디버깅에 도움이 되는 등 여러 장점이 있다.

Etherscan의 다양한 기능

Etherscan의 Contract에서 NFT를 직접 발행할 수 있다는 놀라운 사실! 인기가 많은 NFT의 경우 트래픽이 증가하여 웹 사이트가 느려지는 경우가 있어 사용자에게 안 좋은 경험을 줄 수 있다. 이러한 경우를 대비하여 Etherscan에서 NFT를 발행할 수 있는 기능을 제공한다.

다음과 같은 과정을 거친다.

step1) 내 Web3 지갑에 충분한 양의 ETH가 있는지 확인한다.

step2) 해당 NFT 프로젝트의 Contract를 찾고, Contract → Write Contract → Connect to Web3를 통해Etherscan을 Web3에 연결한다.

step3) minting function을 선택하고, mint(or safeMint) 또는 claim으로 시작하는 함수를 찾는다.

step4) 예시로, BAYC의 임의 NFT 주소를 이용해 보자. 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D 의 mintApe 탭에서 필요한 수량을 작성한다.

step5) Write Contract를 통해 Metamask와 같은 Web3 지갑에서 트랜잭션을 확인한 후 서명하며, 해당 트랜잭션이 성공하면 NFT가 민팅된다. Etherscan에서도 NFT 민팅 기능을 제공한다니, 흥미롭지 않은가!

이렇게 Etherscan에서는 블록 탐색기 등의 역할을 충실하게 함과 동시에 다양한 기능을 제공하고 있다.

  • 해당 주소에 들어오는 트랜잭션이 있을 때마다 경고 또는 알림을 받는 기능
  • 개발자 도구 액세스
  • 데이터 피드 만들기
  • 내가 관심 있는 지갑의 토큰 변동을 추적하기 위해 관심 목록 만들기

개발자를 위한 Etherscan API를 통해 타겟 어카운트의 이더리움 잔액, 트랜잭션 내역 등과 더불어 블록, 컨트랙트, 트랜잭션의 다양한 블록체인 데이터를 가져와 가공하여 개발에 사용할 수 있습니다. 무료/유료 버전에 따라 API 호출 수에 제한이 있다.

이더스캔 페이지에서 여러 기능들을 만나보자!