Ethereum(9) - gethコンソールでトランザクション発行

今回は、gethコンソールでトランザクションを発行します。

トランザクション発行の準備

トランザクションを発行するため下記のような状態にしておきます。

  • gethを起動
  • マイニングを開始
  • Mist Walletを起動
  • スマートコントラクトをデプロイ済み

必要情報の取得

まずはMist Walletより下記の情報を取得します。

  • スマートコントラクトのインターフェース
  • スマートコントラクトのアドレス

スマートコントラクトを表示した画面で①[Show Interface]をクリックします。



下記のような画面が表示されます。

これはABIと呼ばれるものでコントラクトの関数情報などを持つインターフェースです。

②をコピーしておきます。



上記の画面を閉じて、③アドレスを選択しコピーします。

コピーする際に下記のWarning画面が表示されますが、④[COPY ANYWAY]を選択しコピーを行います。

トランザクション発行(gethコンソール)

gethコンソールを使ってトランザクションを発行していきます。

最初にコントラクトの定義を行います。

[コントラクトの定義方法]

1
var con = eth.contract(インターフェース).at('アドレス')

インターフェースとアドレスには、Mist Walletで取得した情報を貼り付けます。

[コマンド]

1
var con = eth.contract([ { "constant": false, "inputs": [ { "name": "_msg2", "type": "string" } ], "name": "setMsg2", "outputs": [], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "counter", "outputs": [ { "name": "", "type": "uint8", "value": "0" } ], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "getMsg2", "outputs": [ { "name": "", "type": "string", "value": "Hello Japan" } ], "payable": false, "type": "function" }, { "constant": false, "inputs": [], "name": "setCounter", "outputs": [], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "owner", "outputs": [ { "name": "", "type": "address", "value": "0xec3b01f36b44182746ca109230567c4915512e35" } ], "payable": false, "type": "function" }, { "constant": true, "inputs": [], "name": "msg1", "outputs": [ { "name": "", "type": "string", "value": "Hello World" } ], "payable": false, "type": "function" }, { "inputs": [ { "name": "_msg1", "type": "string", "index": 0, "typeShort": "string", "bits": "", "displayName": "&thinsp;<span class=\"punctuation\">_</span>&thinsp;msg1", "template": "elements_input_string", "value": "Hello World" } ], "payable": false, "type": "constructor" } ]).at('0x75697Ba2442e8A44d967fE4874f0f14bF9E2CdB3')

コントラクトがconという変数から操作可能になります。

[コントラクトの情報表示]

1
con

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{
abi: [{
constant: false,
inputs: [{...}],
name: "setMsg2",
outputs: [],
payable: false,
type: "function"
}, {
constant: true,
inputs: [],
name: "counter",
outputs: [{...}],
payable: false,
type: "function"
}, {
constant: true,
inputs: [],
name: "getMsg2",
outputs: [{...}],
payable: false,
type: "function"
}, {
constant: false,
inputs: [],
name: "setCounter",
outputs: [],
payable: false,
type: "function"
}, {
constant: true,
inputs: [],
name: "owner",
outputs: [{...}],
payable: false,
type: "function"
}, {
constant: true,
inputs: [],
name: "msg1",
outputs: [{...}],
payable: false,
type: "function"
}, {
inputs: [{...}],
payable: false,
type: "constructor"
}],
address: "0x75697Ba2442e8A44d967fE4874f0f14bF9E2CdB3",
transactionHash: null,
allEvents: function(),
counter: function(),
getMsg2: function(),
msg1: function(),
owner: function(),
setCounter: function(),
setMsg2: function()
}

conはjsonオブジェクト形式で表現されているので、アクセスしたい情報のみの表示もできます。

[addressのみを表示]

1
con.address

[結果]

1
"0x75697Ba2442e8A44d967fE4874f0f14bF9E2CdB3"

配列の要素にアクセスする場合は次のようにします。

[配列要素へのアクセス]

1
con.abi[0].name

[結果]

1
"setMsg2"

いよいよトランザクションの実行を行います。

トランザクションの発行元アドレスのアンロックを行ってから、トランザクションを実行します。

[トランザクションの発行形式]

1
コントラクトを定義した変数名.関数名.sendTransaction(関数の引数, {from:呼び出し元アドレス , gas:Gas Limit})

[コマンド]

1
2
personal.unlockAccount(eth.accounts[0])
con.setMsg2.sendTransaction("Hello Tokyo", {from:eth.accounts[0], gas:5000000});

[結果]

1
2
3
4
Unlock account 0xec3b01f36b44182746ca109230567c4915512e35
Passphrase:
true
"0x1986edeb269889d1a617568a958bc0b2617be5cbedf6e63c11af8cca3ebb2874"

トランザクションが正常に発行されると、上記のようなアドレスが返ります。


発行したトランザクションのレシート情報を表示させます。

[コマンド]

1
eth.getTransactionReceipt("0x1986edeb269889d1a617568a958bc0b2617be5cbedf6e63c11af8cca3ebb2874")

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
blockHash: "0x045014afd90d7510443883f66b7e6957d5e829c130988847e9d2501ec43803bd",
blockNumber: 5002,
contractAddress: null,
cumulativeGasUsed: 33627,
from: "0xec3b01f36b44182746ca109230567c4915512e35",
gasUsed: 33627,
logs: [],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
root: "0xb28ad87e40c4dfcc5627c0be9a47b0ca52c1ba39cb998735857d7ffb56360792",
to: "0x75697ba2442e8a44d967fe4874f0f14bf9e2cdb3",
transactionHash: "0x1986edeb269889d1a617568a958bc0b2617be5cbedf6e63c11af8cca3ebb2874",
transactionIndex: 0
}

blockNumberから5002ブロックに取り込まれたことが確認できます。


トランザクションが取り込まれた5002ブロックの確認を行います。

[コマンド]

1
eth.getBlock(5002)

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
difficulty: 888173,
extraData: "0xda83010817846765746888676f312e31312e358777696e646f7773",
gasLimit: 20000000,
gasUsed: 33627,
hash: "0x045014afd90d7510443883f66b7e6957d5e829c130988847e9d2501ec43803bd",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0xec3b01f36b44182746ca109230567c4915512e35",
mixHash: "0xb31f011cd4dc9d896d5cfbf202efd146bcf5a48d639270e8edc5ed56732ba8a7",
nonce: "0x4dcab0b6406bcf09",
number: 5002,
parentHash: "0x69d89fe08a801520f5dcb4f52cc5a8b8925c8cb1c08b1afdc8c3d5273bc97e5a",
receiptsRoot: "0x9d588cf48eb10b0bd843d3bf8057a17e28cb832f88edb8fb8c1aaf92960c45e2",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 747,
stateRoot: "0x903878d67302c1519ad19c9ac775f22495d378e37f08d617c617c16f597d0e5b",
timestamp: 1625090230,
totalDifficulty: 2086374534,
transactions: ["0x1986edeb269889d1a617568a958bc0b2617be5cbedf6e63c11af8cca3ebb2874"],
transactionsRoot: "0x37b1ebd6abd7eb1a92b88f98938126f0b87f59b46f1c18683771d13ed704a621",
uncles: []
}

transactionsに、今回発行したコントラクトのアドレスが含まれていることを確認できます。


geth上で発行したトランザクションが、Mist Walletに反映されていることを確認します。

Get msg2がHello Tokyoとなっているので正常に反映されていることが分かります。