ABI 디 코딩 이 더 리 움 트 랜 잭 션 입력 데이터 사용,gas free 감소

스마트 계약 을 쓸 때 예전 에 제 습관 은 조회 해 야 할 데 이 터 를 계약 의 이벤트 에 기록 하 는 것 이 었 습 니 다.이런 이벤트 의 필드 는 방법 적 인 참여 입 니 다.이 더 리 움 로그 데이터 gas free 는 상대 적 으로 적 지만 축적 하면 상당 하 다.생각 한 후에 나 는 자신 에 게 몇 가지 규칙 을 정 했다.
  • 색인 이 필요 한 필드,계 산 된 중간 결 과 는 이벤트 에 보관 할 수 있 습 니 다
  • 배경 이 없 는 DApp 는 이벤트 에서 더 많은 필드 를 유지 할 수 있 습 니 다
  • 복잡 한 기능(예 를 들 어 분개장 내 역)을 가 진 DApp 는 대량의 데 이 터 를 여러 번 조회 해 야 할 경우 백 스테이지 로 블록 체인 을 조회 하 는 것 을 고려 할 수 있다.이 때 이벤트 에 포 함 된 함수 입 참 은 보류 할 필요 가 없습니다.데 이 터 는 transaction 의 input 필드 를 통 해 복원 할 수 있 습 니 다.

  • 내 가 보 낸 transaction 을 예 로 들 면
    {
      hash: '0xcc1c866186ff39555936ea007a63ead761aef80d4301eb4e0081e8fc8f6fe18d',
      nonce: 892,
      blockHash: '0xbfff2fc0dd268dfce90417a3ea3b5da3a9e59703d8d4ec6a5be3ba2dce59b924',
      blockNumber: 987,
      transactionIndex: 0,
      from: '0x40FB66078a2e688f83002930B7EbA981323d4bef',
      to: '0x2C71AC97716A17E66D7E524Cfeb28B97A3728250',
      value: '0',
      gas: 5000000,
      gasPrice: '10000000000',
      input: '0x70a1495c00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000003782dace9d900000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000056f70656e31000000000000000000000000000000000000000000000000000000',
      v: '0x1b',
      r: '0xbfbd3aef6c6777598847de0aa1ffcaf50470f785054771a54e2e274b89d1a633',
      s: '0x27aea35dd4d462598ac909b55444ec0131c7977fe2ad244eaac0cc28b70e07f1'
    }

    긴 input 필드 를 볼 수 있 습 니 다.이 필드 는0x70a1495c로 시작 합 니 다.이것 은 함수 서명 이 고 뒤의 데 이 터 는 유형 에 따라 데 이 터 를 연결 하 는 것 입 니 다.이 함수 의 abi 를 다시 보 겠 습 니 다.
    {
      constant: false,
      inputs: [
        { internalType: 'bytes', name: 'name', type: 'bytes' },
        { internalType: 'bool', name: 'isOpen', type: 'bool' },
        { internalType: 'bool', name: 'isCustom', type: 'bool' },
        { internalType: 'uint256', name: 'cusPrice', type: 'uint256' },
        { internalType: 'uint8', name: 'durationInYear', type: 'uint8' }
      ],
      name: 'registerRoot',
      outputs: [],
      payable: false,
      stateMutability: 'nonpayable',
      type: 'function',
      signature: '0x70a1495c'
    }

    signature 도0x70a1495c이 서명 이 어떻게 생 성 되 었 는 지 볼 수 있 습 니 다.사실은 간단 합 니 다.web3.eth.abi.encodeFunctionSignature("registerRoot(bytes,bool,bool,uint256,uint8)")는 짧 은 Hash 입 니 다.제거0x70a1495c한 후에 나머지 데 이 터 를 디 코딩 합 니 다.
    web3.eth.abi.decodeParameters(["bytes","bool","bool","uint256","uint8"],"0x00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000003782dace9d900000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000056f70656e31000000000000000000000000000000000000000000000000000000")
    Result {
      '0': '0x6f70656e31',
      '1': true,
      '2': true,
      '3': '4000000000000000000',
      '4': '1',

    마지막 으로 필드 이름 을 맞 추 면 됩 니 다.스스로 해석 함 수 를 썼 습 니 다.다음 과 같 습 니 다.
    async function decodeParamsOfTransaction(txHash, func_abi){
        var txData = await web3.eth.getTransaction(txHash);
        var input = txData.input;
        var types = func_abi.inputs.map(x=>x.internalType);
        var _d = "0x"+input.replace(func_abi.signature,"");
        var names = func_abi.inputs.map(x=>x.name);
        var r = web3.eth.abi.decodeParameters(types, _d);
        var dic = {}
        for(var i=0; i

    다음 과 같은 결 과 를 얻 을 수 있 습 니 다:
    {
      name: '0x6f70656e31',
      isOpen: true,
      isCustom: true,
      cusPrice: '4000000000000000000',
      durationInYear: '1'
    }

    좋은 웹페이지 즐겨찾기