반응형
목표
이더리움 전송에 대해 공부 하는 것
getTransactionReceipt
{
blockHash: '0x43f34ae1b9cda49947a4b1001081356f80144d6ce2299ae7f959befe2125f55c',
blockNumber: 10240861,
contractAddress: null,
cumulativeGasUsed: 1196178,
from: '0xcdd6a2b9dd3e386c8cd4a7ada5cab2f1c561182d',
gasUsed: 21000,
logs: [],
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
status: true,
to: '0x142e6c18e62d1bdca2ce40c05c6ecb3e1af1848c',
transactionHash: '0x663ae686dc57a55262704c8f1a8b133e1548fd0e32ae72d399630ad842d68be7',
transactionIndex: 14
}
receipt 정보는 트랜잭션이 블록체인 상에 배포 된 후에 생김
위의 정보는 일반적인 이더 전송 receipt이며, contractAddress가 null임을 확인 할 수 있다. 컨트랙트 생성 트랜잭션인 경우, contractAddress에 해당주소가, to 필드는 비어있음을 확인할 수 있다.
토큰 전송 트랜잭션인 경우, contractAddress에는 보낼 토큰 주소 정보가, to 필드에는 받는 주소 정보가 들어있다.
요약
일반 적인 전송 contractAddress X, to O
컨트랙트 생성 contractAddress O, to X
토큰 전송 contractAddress O, to O
트랜잭션 처리 순서
특정 주소 A -> B로 트랜잭션을 보낸다고 할 때
1. 해당 트랜잭션에 대해 사용자 A가 자신의 개인키로 ECDSA 전자 서명 암호화시킨다.
ECDSA란
송금할 때 디지털서명하는 알고리즘
공개키(계좌주소)와 비밀키(개인키) 쌍이있는데 비밀키를 알아야만 해당 공개키에 해당하는 서명코드를 작성하는게 가능합니다. 이것을 ECDSA의 한 디지털 서명이라고 합니다.
2. 이더리움 클라이언트는 해당 트랜잭션을 네트워크에 연결되어있는 모든 노드에 브로드 캐스팅 한다.
3. 마이너에서 유효성을 검증한다.
유효성 검증
트랜잭션이 문법에 맞는지
A의 공개키를 이용해 해당 전자 서명이 유효한지(신원 검증)
A의 Account에 있는 Nonce와 일치하는지 (이중 지불 방지)
가스 비용을 계산하고, B의 어카운트 주소를 확인한다.(모든 20바이트 값은 유효한 것으로 간주함 - 이더리움은 올바르게 파생되었는지 여부를 판단할 수 없다.)
모든 검증 작업이 완료되면 퇴종 실행을 위해 해당 트랜잭션을 트랜잭션 풀에 등록한다.
마이너가 트랜잭션 풀에서 트랜잭션을 처리시, 가스 실행 비용이 높은 순으로 트랜잭션을 선택한다.
이더 전송: B에 송금
B가 contract: contract code 실행
마이너 트랜잭션
그럼 마이너 트랜잭션 풀이 하는일은 뭘까
마이너의 트랜잭션 처리 과정
블록에 담을 트랜잭션들을 Transaction Pool에서 가져온다.
트랜잭션들에 대해 Nonce, Gas Price로 순서를 정한다.
마이너가 트랜잭션에 설정된 값 (Gas_limit * Gas_Price) 만큼을 발신 주소로부터 txfee 가져온다.
트랜잭션을 실행하며, 명령어에 따라 가스를 소모 한다.
남는 가스는 해당 트랜잭션 발신 주소로 다시 돌려준다.
가스가 모자라는 경우 트랜잭션이 Revert되며 가스는 다시 돌려주지 않는다.
실행된 트랜잭션들을 블록에 담는다(개별 Gas Limit의 총합은 Block Gas Limit를 넘길 수 없다.)
Nonce
오케 그럼 Nonce 로 순서를 정한다는데 이건 뭐..?
Nonce
특정 주소에서 보내는 트랜잭션에 할당된 번호로 거래 전송 시마다 nonce값이 1씩 증가하며, 한 주소에 동일한 nonce를 갖는 트랜잭션은 존재하지 않는다.
nonce는 순차적으로 증가되고 처리된다. (역행 불가)
아직 트랜잭션이 transaction pool에 남아있는 경우에 한해서, nonce를 이용해 트랜잭션을 재전송하여 취소된 효과를 볼 수 있다.
이중 지불 문제를 방지시킨다 (같은 nonce에 여러 트랜잭션이 전송된 경우, 제일 높은 가스비를 지불한 트랜잭션을 처리시킨다.)
출처 https://taeyonghwang.github.io/ethereum/ethereum-transaction/
반응형
'나만의 꿀팁' 카테고리의 다른 글
[이더리움] 이더리움 토큰 생성, ICO 개념 (0) | 2022.01.20 |
---|---|
[블록체인]블록체인 ECDSA (0) | 2022.01.19 |
[NFT] NFT 관련 다양한 용어 (0) | 2022.01.17 |
[블록체인] 블록체인 용어 (0) | 2022.01.17 |
[쿠키런 폰트] 쿠키런 폰트 다운 받기 (0) | 2021.11.26 |
댓글