Ethereum ERC20 Transaction(2)

4160 단어 Ethereum
전편에서 우리는 ERC20 기호화폐를 만드는 과정을 소개했고 본고는 JSON-API 인터페이스를 이용하여 ERC20 기호화폐를 개발하는 과정에서의 관련 조작을 소개할 것이다.

1. 기호화폐를 발송한다.


ETH의 Transaction에는 몇 가지 중요한 필드가 있는데 from,to,value,datainput이다.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')를 통해 이 주소의 토큰 잔액을 얻었습니다.

좋은 웹페이지 즐겨찾기