Help us understand the problem. What is going on with this article?

Ethereumのトランザクションの流れ(1) フロント編

More than 1 year has passed since last update.

web3.jsからトランザクションを実行する流れを追っていきます。
web3.jsのversionはv1.0.0-beta.36です。

call web3編

transfer(address) を実行するコード

const Web3 = require('web3');
const web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));
web3.eth.defaultAccount=web3.eth.accounts[0];
const ABI = require("./abi.js").abi;

const ADDRESS = "0x09ce7c529fd05ca8e5599f0ed424f48cd2a5424e";
const OWNER = "0x0be26a388d0524eeb0afbc08ee015e08e83e802c";
const contract = new web3.eth.Contract(ABI, ADDRESS);

const transfer = async (address) => {
    return await contract.methods.transfer(address, 100).send({
        from: OWNER,
    });
};

(async () => {
    console.log(await transfer("0xfc49f3aedc6d2f0cab4e0a1ff66913ccf2fe3661"));
})();

json-rpcとして下記のリクエストを実行する

{ jsonrpc: '2.0',
  id: 3,
  method: 'eth_sendTransaction',
  params:
   [ { from: '0xd986f2cb72530f45bfd575196fbad7064c454ecc',
       data:
        '0xa9059cbb000000000000000000000000d986f2cb72530f45bfd575196fbad7064c454ecc0000000000000000000000000000000000000000000000000000000000000064',
       gasPrice: '0x1',
       gas: undefined,
       to: '0xf30a6701ff5e70aabf27f474b3b4ae72563c3217' } ] }

dataの仕組み

signatureの作成

    {
      "constant": false,
      "inputs": [
        {
          "name": "_to",
          "type": "address"
        },
        {
          "name": "_value",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "name": "",
          "type": "bool"
        }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }

上のようなabiのObjectから

// web3.js/packages/web3-eth-abi/src/index.js
var utils = require('web3-utils');
// 省略
ABICoder.prototype.encodeFunctionSignature = function (functionName) {
    if (_.isObject(functionName)) {
        functionName = utils._jsonInterfaceMethodToString(functionName);
    }

    return utils.sha3(functionName).slice(0, 10);
};

transfer(address,uint256) が 0xa9059cbbになる

引数の部分

// web3.js/packages/web3-eth-abi/src/index.js
ABICoder.prototype.encodeParameters = function (types, params) {
    return ethersAbiCoder.encode(this.mapTypes(types), params);
};

var ret = coder.encodeParameters(['address'], ['0xd986f2cb72530f45bfd575196fbad7064c454ecc']);

で、 000000000000000000000000d986f2cb72530f45bfd575196fbad7064c454ecc0000000000000000000000000000000000000000000000000000000000000064 となる

t10471
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away