Ethereum ERC20 Transaction(2)
4160 단어 Ethereum
1. 기호화폐를 발송한다.
ETH의
Transaction
에는 몇 가지 중요한 필드가 있는데 from
,to
,value
,data
input
이다.from
: Transaction은 누가 발기했습니까?to
: Transaction이 보낼 주소입니다.value
: Transaction에서 보낸 ETH의 수입니다.data
: 일부api의 필드 이름은 input
이고 의미는 모두 같다. 이 Transaction에 첨부된 데이터를 대표하며 보통 일부 스마트 계약을 실행하는 명령이다.이더리움 JSON-Api의 사용에 대해 한 문장에서 우리는 JSON-API의 기본적인 사용을 소개했는데 먼저 읽을 수 있고 본고의 개념을 이해하기 편리하다.
기호화폐의 발송도 Transaction을 통해 이루어진다. ETH를 보내는 것과 달리
from
는 토큰의 발송자 주소이고, to
는 토큰의 계약 주소이며, value
는 보통 0이다. ETH가 토큰과 함께 보내지 않아도 된다.data
는 서로 다른 token과 수신 주소, 수량에 따라 인코딩된 것으로 인코딩 형식은 이더리움 Contract ABI 형식을 따른다.상세한 정보는 링크에 있는 이태방의 공식 기사 소개를 읽을 수 있으며, 실현의 중요한 세부 사항을 소개하면 된다.일반적인 토큰발송
data
부분은 세 부분을 포함한다.지령의hash;2. 계좌 접수;3. 수량은 이 세 부분을 연결하여 만든다.1. 지령hash.
ERC20의 코드로 돌아가면 보내는 함수는 다음과 같다. ABI 인코딩의 규칙에 따라 우리는
web3.sha3("transfer(address,uint256)")
방법으로 값을 계산하고 앞의 4바이트(8개의 16진수)를 취하여Transaction의 명령hash를 받아야 한다.ERC20 표준 transfer
함수의 명령hash 전 8 바이트는 a9059cbb
이다./**
* Transfer tokens
*
* Send `_value` tokens to `_to` from your account
*
* @param _to The address of the recipient
* @param _value the amount to send
*/
function transfer(address _to, uint256 _value) public {
_transfer(msg.sender, _to, _value);
}
2. 계좌 접수.일반적인 이더리움 계정은 20바이트(40개의 16진수)로 앞에
0x
를 붙인다.데이터 부분에서는 40개의 16진수 앞에 24개0
를 채워 총 64개의 16진수를 채워야 한다.3. 수량.수량을 16진수(1e-18 단위)로 바꾸어 똑같이 몇 개
0
를 채우고 64개의 16진수로 채운다.그리고 세 부분을 연결하여 Transaction의 데이터로 만든다.예를 들어
0x299432642dcc4c2f33ff0f5d41b8f4154b82ae2a
주소로 1000개의 토큰을 보냅니다.데이터 섹션은 다음과 같습니다.0x
+a9059cbb
+000000000000000000000000299432642dcc4c2f33ff0f5d41b8f4154b82ae2a
(수신주소)+00000000000000000000000000000000000000000000021e19e0c9bab2400000
(수신수량 16진법은 1e-18 단위로 표시됨).그래서 보낸 Transaction 매개 변수는 from
:0x
;to
: 0x
; value
:0x; data
: 0xa9059cbb000000000000000000000000299432642dcc4c2f33ff0f5d41b8f4154b82ae2a00000000000000000000000000000000000000000000021e19e0c9bab2400000
. 2. 모 주소의 기호화폐 잔액을 확인한다.
token 잔액을 보면 블록체인의 어느 위치에 있는 데이터 변수 값을 보려면 JSON-API 발송
eth.getStorageAt
을 통해 얻어야 한다.contract TokenERC20 {
// Public variables of the token
string public name;
string public symbol;
uint8 public decimals = 18;
// 18 decimals is the strongly suggested default, avoid changing it
uint256 public totalSupply;
// This creates an array with all balances
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
상기 ERC20 코드의 변수, 그중
mapping(address => uint256) public balanceOf;
은 각 계정의 잔액을 저장하는 변수이다.획득한 규칙은 balanceOf
은 네 번째 매개 변수(name은 0번째)이고 4를 64개의 16진수, 즉 0000000000000000000000000000000000000000000000000000000000000004
로 보충하는 것이다.그리고 토큰을 보내는 규칙에 따라 잔액을 가져올 주소를 64개의 16진수로 보충합니다.input = "64 "+"64 "
의 문자열을 얻어서 계산할 수 있다hash = web3.sha3(input)
.마지막으로 eth.getStorageAt(contract address, hash, 'latest')
를 통해 이 주소의 토큰 잔액을 얻었습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
zkSync를 사용하여 이더미의 기존 구조기를 시작합니다이걸 이용하면 기분이 좋다면 예전의 이더리움의 안전성을 유지하고 많은 거래를 처리할 수 있고 가스비도 적당히 싸게 받을 수 있다.대략적인 구조로 계산 처리와 저장 데이터가 zkSync에서 실행되고 이 거래를 총괄하여...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.