Ethereumのトランザクションの流れ(1) フロント編
12211 ワード
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"
}
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"));
})();
{ jsonrpc: '2.0',
id: 3,
method: 'eth_sendTransaction',
params:
[ { from: '0xd986f2cb72530f45bfd575196fbad7064c454ecc',
data:
'0xa9059cbb000000000000000000000000d986f2cb72530f45bfd575196fbad7064c454ecc0000000000000000000000000000000000000000000000000000000000000064',
gasPrice: '0x1',
gas: undefined,
to: '0xf30a6701ff5e70aabf27f474b3b4ae72563c3217' } ] }
{
"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
となる
Author And Source
この問題について(Ethereumのトランザクションの流れ(1) フロント編), 我々は、より多くの情報をここで見つけました https://qiita.com/t10471/items/73545e0f93ea63820953著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .