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となっているので正常に反映されていることが分かります。

Ethereum(9) - Mist Walletでトランザクション発行

前回は、Mist Walletを使ってスマートコントラクトをデプロイしました。

今回は、デプロイしたスマートコントラクトに対してトランザクションを発行します。

トランザクション発行の準備(Mist Wallet)

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

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

トランザクション発行(Mist Wallet)

Mist Walletを使ってトランザクションを発行していきます。

①CONTRACTタブを選択し、②前回デプロイしたスマートコントラクトをクリックします。



③Select FunctionでSet Msg 2を選択し、④msg2に「Hello Japan」を入力します。

⑤EXECUTEボタンをクリックします。



⑥Provide maximum feeに手数料を入力できますが、今回はデフォルトのままにしました。

⑦アカウント(アドレス)のパスワードを入力し、⑧SEND TRANSACTIONをクリックします。



⑨WALLETSタブを選択し、⑩発行したトランザクションがブロックに取り込まれるのを待ちます。

ブロックに取り込まれたら⑩トランザクションを選択します。



⑪Getmsg 2に「Hello Japan」が表示されているので、問題なくトランザクションが発行され、ブロックに取り込まれたことが分かります。



次回は、gethコンソールから同じようにトランザクションの発行を行います。

Ethereum(8) - スマートコントラクト①

前回までの記事で、gethの起動とMist Walletの起動ができるようになりました。

今回はこの環境を使って、簡単なスマートコントラクトを実行してみます。

準備

スマートコントラクトを実行するために、下記の状態にしておきます。

  • gethを起動
  • アカウント(アドレス)を1つ作成
  • マイニングを開始
  • Mist Walletを起動

スマートコントラクトの内容

今回試すスマートコントラクトは下記になります。

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
pragma solidity ^0.4.11;
contract HelloEthereum {
string public msg1;

string private msg2;

address public owner;

uint8 public counter;

/// コンストラクタ
function HelloEthereum(string _msg1) {
// msg1に _msg1を設定
msg1 = _msg1;
// ownerに本コントラクトを生成したアドレスを設定
owner = msg.sender;
// counterに初期値として0を設定
counter = 0;
}

/// msg2の設定
function setMsg2(string _msg2) public {
// if文の例
if(owner != msg.sender) {
throw;
} else {
msg2 = _msg2;
}
}

// msg2の取得
function getMsg2() constant public returns(string) {
return msg2;
}

// カウンターの設定
function setCounter() public {
// for文のサンプル
for(uint8 i = 0; i < 3; i++) {
counter++;
}
}
}

メッセージを設定・取得したり、カウンターを設定する簡単な処理になります。

スマートコントラクトのデプロイ

Mist Walletの①Contractタブを選択し、②DEPLOY NEW CONTRACTをクリックします。



③FROMにはスマートコントラクトを生成するアカウント(オーナー)を指定します。

④SOLIDITY CONTRACT SOURCE CODEにはスマートコントラクトの内容(コード)を記述します。

⑤SELECT CONTRACT TO DEPLOYではHello Ethereumを選択します。

⑥引数msg1にはHello Worldを記入します。



画面を下にスクロールし⑦DEPLOYボタンをクリックします。



⑧Provide maximum feeには5000000を入力します。これはGas Limitに相当し、テスト環境のため大きめの値を設定しました。

⑨アカウント作成時に設定したパスワードを入力します。

⑩SEND TRANSACTIONをクリックします。この後はWALLETSタブに自動遷移します。



画面下にスクロールするとLATEST TRANSACTIONSにデプロイしたスマートコントラクトが表示されています。

Create Contractが薄い色の場合は、まだブロックに取り込まれていないので、色がはっきりするまで少々待ちます。

ブロックに取り込まれたら⑪Hello Ethereum 7569を選択します。



⑫デプロイしたスマートコントラクトの詳細が表示されます。

⑬Msg1には、デプロイ時に指定した文字が表示されています。



次回はMist Walletからこのスマートコントラクトのトランザクションを発行してみます。

Ethereum(7) - Mist Wallet(公式ウォレット)のインストールと起動(Windows編)

前回はUbuntu20.04にて、Ethereumの公式ウォレットMist Walletを起動しようとしましたが、うまくいきませんでした。

その後、解消方法を調べたのですが結局起動することができなかったので、Ubuntu上でMist Walletを起動するのは諦めました。

Windows版

Windows版でいろいろなバージョンの組み合わせで動作確認を行ったところ、(だいぶ古いバージョンになりますが)次の組み合わせでMist Walletを起動させることに成功しました。

  • geth-windows-amd64-1.8.23-c9427004.exe
  • Ethereum-Wallet-win64-0-8-10.zip

geth-windows-amd64-1.8.23-c9427004.exeのダウンロード

geth [geth-windows-amd64-1.8.23-c9427004.exe] - https://geth.ethereum.org/downloads/

Windowsタブを選択し、Show older releasesをクリックします。

画面をスクロールしGeth 1.8.2 - Installer - 64-bitをダウンロードします。

Ethereum-Wallet-win64-0-8-10.zipのダウンロード

Mist Wallet [Ethereum-Wallet-win64-0-8-10.zip] - https://github.com/ethereum/mist/releases/tag/v0.8.10

Windows版でMist Wallet起動

ダウンロードしたファイルをそれぞれインストールし、Gethを起動したあとでMist Walletを起動すると問題なく下記の画面が立ち上がりました。



次回からは、このGethとMist Walletの組み合わせでスマートコントラクトの動作確認をしていきます。

Ethereum(6) - Mist Wallet(公式ウォレット)のインストールと起動

Mist Wallet(ミストウォレット)は、Ethereumの公式ウォレットです。

下記のような機能を持っています。

  • アカウントの生成
  • etherの残高確認や送金
  • スマートコントラクトの生成/関数呼び出し
  • イベントの確認

Mist Wallet(ミストウォレット)のダウンロード

Mist Walletを下記サイトよりダウンロードします。

Mist Wallet(ミストウォレット) - https://github.com/ethereum/mist/releases

Ubuntu20.04で動作確認をしていますので、Ethereum-Wallet-linux64-0-11-1.zipをダウンロードしました。

ダウンロードしたzipファイル解凍します。

[コマンド]

1
unzip Ethereum-Wallet-linux64-0-11-1.zip

解凍すると次のようなファイルが作成されます。

Mist Wallet(ミストウォレット)の起動

Mist Wallet(ミストウォレット)を起動するために、解凍したディレクトリに移動し次のコマンド実行します。

[コマンド]

1
./ethereumwallet

[結果]

1
./ethereumwallet: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory

上記のようなエラーが発生しました。

不足のライブラリlibgconf-2.so.4をインストールします。

[インストールコマンド]

1
sudo apt-get install libgconf-2-4

もう一度起動してみます。

[コマンド]

1
./ethereumwallet

またエラーが発生しました。

ダイアログに表示されているコマンドを実行し、NTPをインストールします。

[インストールコマンド]

1
sudo apt-get install ntp

再度起動してみます。

[コマンド]

1
./ethereumwallet

Ethereum Walletのウィンドウが表示され、あと一歩という感じでしたが、三度エラーが発生しました。

「ノードにつながりませんか?ログを見てください」とのことでログを確認します。

(ちなみにgethは起動した状態になっています。)

[all.log]

1
2
3
4
5
[2021-06-27T07:52:02.042] [ERROR] EthereumNode - Failed to connect to node Error: Unable to connect to socket: timeout
at Timeout.setTimeout [as _onTimeout] (/home/aki/ダウンロード/wallet/resources/app.asar/modules/sockets/base.js:93:27)
at ontimeout (timers.js:469:11)
at tryOnTimeout (timers.js:304:5)
at Timer.listOnTimeout (timers.js:264:5)

ノードにつながらずタイムアウトになったようですが、解決するヒントになるような情報はないようです。

次回は、この問題を調査し解決していきたいと思います。

Ethereum(5) - 送金(解決編)

前回は送金前にアカウントのロックを解除しようとしてエラーが発生しました。

今回はその解決編です。

geth起動オプションの追加

エラーメッセージの”account unlock with HTTP access is forbidden at web3.js”を検索したところ、gethの起動時に–allow-insecure-unlockオプションを追加すればよいとの情報を見つけました。

[コマンド]

1
2
geth --allow-insecure-unlock --networkid "10" --nodiscover --datadir "~/eth_net" --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" console 2>> ~/eth_net/geth_err.log

[結果]

1
2
3
4
5
6
7
8
9
10
Welcome to the Geth JavaScript console!

instance: Geth/v1.10.4-stable-aa637fd3/linux-amd64/go1.16.4
coinbase: 0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c
at block: 485 (Sat Jun 26 2021 06:50:42 GMT+0900 (JST))
datadir: /home/aki/eth_net
modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

To exit, press ctrl-d
>

問題なく起動できました。

アカウントロックの解除

前回失敗したアカウントロックの解除コマンドを再度実行します。

[コマンド]

1
personal.unlockAccount(eth.accounts[0])

[結果]

1
2
3
Unlock account 0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c
Passphrase:
true

今度は問題なくロックを解除することができました。

送金

マイニングを開始し、送金処理を実行してみます。

それぞれのパラメータの意味は次の通りです。

  • from
    送金元のアドレス。
  • to
    送信先のアドレス。
  • value
    送金額。wei表示での送金額。web3.toWei関数を使ってetherをweiに変換しています。

[コマンド]

1
2
miner.start(2)
eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:web3.toWei(5, "ether")})

[結果]

1
"0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c"

結果には16進のトランザクションハッシュが出力されます。

トランザクション確認

トランザクションの中身を確認します。

引数には送金した際に出力されたトランザクションハッシュを指定します。

[コマンド]

1
eth.getTransaction('0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c')

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
blockHash: "0xe747b7c38b25a01a50cb5702414411fc947f1b5e2d9b8926c362ead467537120",
blockNumber: 506,
from: "0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c",
gas: 21000,
gasPrice: 1000000000,
hash: "0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c",
input: "0x",
nonce: 0,
r: "0xc2e868fe0ad7eb061ef298665d7b2066c162e14b5c1cf256861ab17c7bd91ef8",
s: "0x45a8876c1ff252b80ce9d3abfedbd5924bbf59b8c380b25dfeffa4ab862115a0",
to: "0xcdf900d55700e14e1f1f92d20da5aa70611010d7",
transactionIndex: 0,
type: "0x0",
v: "0x42",
value: 5000000000000000000
}

fromには送信元のアドレスが表示され、toには送信先のアドレスが表示されます。

valueにはwei表示での送金額が表示されます。etherに換算すると5etherになります。

トランザクションのレシート確認

次にトランザクションのレシートを確認します。

[コマンド]

1
eth.getTransactionReceipt('0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c')

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
blockHash: "0xe747b7c38b25a01a50cb5702414411fc947f1b5e2d9b8926c362ead467537120",
blockNumber: 506,
contractAddress: null,
cumulativeGasUsed: 21000,
effectiveGasPrice: 1000000000,
from: "0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c",
gasUsed: 21000,
logs: [],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
status: "0x1",
to: "0xcdf900d55700e14e1f1f92d20da5aa70611010d7",
transactionHash: "0x489deb0f0e2b7366733e48f29481ace37d7906fb5f3b052879e87dda29cd275c",
transactionIndex: 0,
type: "0x0"
}

トランザクションがブロックに取り込みが完了されていれば上記のような情報が表示されます。

「null」が返ってきた場合は、まだブロックに取り込まれていないので少し待つ必要があります。(Ethereumでは約15秒間隔でマイニングされます。)

blockNumberを見ると、506ブロックに取り込まれたことが確認できます。

送金先の残高確認

送金先アドレスの残高を確認します

[コマンド]

1
web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")

[結果]

1
5

5etherがきちんと送金されていることが分かります。

Ethereum(4) - マイニングと送金

前回に引き続きgethコンソール上での作業を行います。

マイニング

下記のコマンドを実行するとマイニングが開始されます。

引数の2は、マイニングに利用するスレッド数となります。

[コマンド]

1
miner.start(2)

[結果]

1
null

「null」か「true」と表示されれば、マイニングが開始されています。

マイニングの確認

マイニング中であるかどうかを確認します。

[コマンド]

1
eth.mining

[結果]

1
true

「true」であればマイニング中です。

coinbaseの残高確認

マイニングを行うとetherを獲得でき、coinbaseの残高が増加します。

残高を確認するために次の2関数を使っています。

  • eth.getBalanc関数
    対象アドレスの残高確認する。結果はwei表記。
  • web3.fromWei関数
    wei表記をether表記に変換する。

[コマンド]

1
web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")

[結果]

1
84

アカウント作成直後の残高は0ですので、0より大きい値になっていれば正常にマイニングできています。

送金する

送金処理を行います。

まだアカウントが1つしかないので、送金先用のアカウントを1つ作成します。

[コマンド]

1
personal.newAccount("passwd")

[結果]

1
"0xcdf900d55700e14e1f1f92d20da5aa70611010d7"

次に、送金処理を行う前準備として送信元のアカウント(eth.accounts[0])のロックを解除します。

[コマンド]

1
personal.unlockAccount(eth.accounts[0])

[結果]

1
2
3
4
5
Unlock account 0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c
Passphrase:
GoError: Error: account unlock with HTTP access is forbidden at web3.js:6357:37(47)
at native
at <eval>:1:24(6)

???エラーとなってしまいました。

「HTTPアクセスでのアンロックは禁止されている」とのことです。

次回は、このエラーを解決したいと思います。

Ethereum(3) - アカウント作成とgenesisブロックの確認

前回のgethを起動したところからの続きです。

gethの対話型コンソールが起動しており、以降はgethコンソール上での作業となります。

アカウント作成

まずはアカウントを作成します。(引数のパスワードは自由に設定してください。)

[アカウント作成コマンド]

1
personal.newAccount("passwd")

[結果]

1
"0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c"

正常にアカウントが作成されると、アドレスが出力されます。

このアドレスは銀行でいうと口座番号になります。

パスワードは暗証番号にあたるので、他の人に絶対に知られてはいけません。

(パスワードを忘れてしまうと、そのアカウントの資産にアクセスできなくなってしまい、救済措置もありませんので、パスワード管理は慎重に行ってください。)


次に、作成したアカウントの一覧を表示します。

[アカウント確認コマンド]

1
eth.accounts

[結果]

1
["0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c"]

まだ1つしかアカウントを 作成していませんが、複数アカウントを作成した場合はその全てのアドレスが表示されます。


次に、マイニングを行うcoinbaseアカウントを確認します。

[coinbaseアカウント確認コマンド]

1
eth.coinbase

[結果]

1
"0xf4572ec53ab834afa1bd93a2cb32f070fda1c06c"

coinbaseアカウントを変更するときは下記のコマンドを使います

(現状1アカウントしかないので、同じアカウントに切り替えています)

[coinbaseアカウント変更コマンド]

1
miner.setEtherbase(eth.accounts[0])

[結果]

1
true

genesisブロックの確認

ブロックの内容を確認するにはeth.getBlockを使います。

0を指定すると、genesisブロックの内容が確認できます。

[genesisブロックの確認]

1
eth.getBlock(0)

[結果]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
difficulty: 0,
extraData: "0x00",
gasLimit: 20000000,
gasUsed: 0,
hash: "0x76d747ec34337ec5677b1aba554769485e160663eee3c63486400bddc21a5e65",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x0000000000000000000000000000000000000000",
mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
nonce: "0x0000000000000042",
number: 0,
parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 505,
stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
timestamp: 0,
totalDifficulty: 0,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}

次回は、マイニングと送金の操作を試します。

Ethereum(2) - genesisブロックの作成とgethの起動

前回は、Ethereumに参加するためのクライアントgethをインストールしました。

今回は、genesisブロックの作成gethの起動を行います。

genesisブロックの作成

まずはプライベートネット用のデータディレクトリを作成します。

[コマンド]

1
mkdir ~/eth_net/

次に、作成したディレクトリの中に1番最初のブロックであるGenesisブロック(genesis.json)を作成します。

[genesis.json]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0
},
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x00",
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x00",
"gasLimit": "0x1312d00"
}

初期化処理

ブロックチェーンの初期化処理を行います。

–datadirにデータ用のディレクトリを指定し、initにgenesisファイルを指定します。

[コマンド]

1
geth --datadir "~/eth_net" init ~/eth_net/genesis.json

[結果]

1
2
3
4
5
6
7
8
(途中略)
INFO [06-23|06:42:21.095] Writing custom genesis block
INFO [06-23|06:42:21.095] Persisted trie from memory database nodes=0 size=0.00B time="3.706µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [06-23|06:42:21.096] Successfully wrote genesis state database=chaindata hash=76d747..1a5e65
INFO [06-23|06:42:21.096] Allocated cache and file handles database=/home/aki/eth_net/geth/lightchaindata cache=16.00MiB handles=16
INFO [06-23|06:42:21.112] Writing custom genesis block
INFO [06-23|06:42:21.112] Persisted trie from memory database nodes=0 size=0.00B time="2.441µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [06-23|06:42:21.113] Successfully wrote genesis state database=lightchaindata hash=76d747..1a5e65

最後にSuccessfully wrote genesis stateというログが表示されていれば、初期化処理は正常終了しています。

gethの起動

下記のコマンドを実行し、gethを起動します。

[コマンド]

1
geth --networkid "10" --nodiscover --datadir "~/eth_net" --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" console 2>> ~/eth_net/geth_err.log

[結果]

1
2
3
4
5
6
7
8
9
Welcome to the Geth JavaScript console!

instance: Geth/v1.10.4-stable-aa637fd3/linux-amd64/go1.16.4
at block: 0 (Thu Jan 01 1970 09:00:00 GMT+0900 (JST))
datadir: /home/aki/eth_net
modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

To exit, press ctrl-d
>

上記のように表示されていれば問題なくgethが起動しています。

次回はアカウントの作成を行います。

Ethereum(1) - gethのインストール

Ethereumに参加するためのクライアントはいくつかありますが、今回は一番ポピュラーなgethをインストールします。

gethの主な機能は下記のとおりです。

  • スマートコントラクトの生成と実行
  • etherの送金
  • アカウント作成
  • マイニング

ダウンロード

gethを下記サイトよりダウンロードします。

geth - https://geth.ethereum.org/downloads/

テスト環境としてUbuntu20.04を使用するため、Linux版のGeth 1.10.4 (64bit)をダウンロードします。

インストール

ダウンロードしたファイルを解凍し、gethコマンドへのシンボリックリンクを作成します。

[インストールコマンド]

1
2
tar xzvf geth-linux-amd64-1.10.4-aa637fd3.tar.gz 
sudo ln ./geth-linux-amd64-1.10.4-aa637fd3/geth /usr/local/bin/geth

動作確認

gethコマンドがインストールされていることを確認します。

[コマンド]

1
which geth

[結果]

1
/usr/local/bin/geth

次回はgethの起動を行います。