改元されて1ヶ月ちょい経ちましたがいかがお過ごしでしょうか。
私はというと駆け出しですがブロックチェーンに関わるようになりました。
これまでのWebアプリ開発と異なることが多いのでとても苦労しています。。。
ということで今回はブロックチェーン(Ethereum)ネタです。
Ethereumのブロックチェーン上に「令和」が書き込まれている
らしいです。
実際に書き込まれているかGo-Ethereum(Geth)を使用して確認してみます。
Gethとは
その名の通りGo言語で作られたEthereumのクライアントです。サードパーティで作られたクライアント(Parity等)もありますが、Gethはオフィシャルです。
Ubuntuならaptを使用して
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum
macOSならHomebrewを使用して
$ brew tap ethereum/ethereum
$ brew install ethereum
でインストールできます。
ちなみに私の環境は
$ geth version
Geth
Version: 1.8.27-stable
Git Commit: 4bcc0a37ab70cb79b16893556cffdaad6974e7d8
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.10.4
Operating System: linux
GOPATH=
GOROOT=/usr/lib/go-1.10
となっております。
Ethereumのメインネットに接続
メインネットについて簡単に説明すると、仮想通貨としてのEthereumが稼働しているネットワークのことです。
このほかにテストネットや企業・個人が運用しているプライベートネットなどがあります。
Gethからメインネットに接続するには下記のようにします。
$ geth --syncmode light console 2>>/dev/null
--syncmode light
とすることで軽量クライアントモードで接続します。
デフォルトでは--syncmode fast
となり、100GB以上のデータをダウンロード(同期)しようとするので注意です。
また、Gethの入門サイト等ではよく
- アカウントを作成する
- genesis.jsonを作成する
等の説明がありますが、今回はトランザクションの中身を見るだけなのでアカウントは作成しません。また、メインネットに接続するのでgenesis.jsonも作成する必要はありません。
上記コマンドを実行すると下記のような表示になるかと思います。
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.27-stable-4bcc0a37/linux-amd64/go1.10.4
modules: admin:1.0 debug:1.0 eth:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
ブロックが同期されるのを待つ
コンソールにeth.blockNumber
と入力してみます。
> eth.blockNumber
0
今回の目的のトランザクションはブロック数7480083に記録されているので、eth.blockNumber
が7480083以上になるまでしばらく待ちます。
> eth.blockNumber
7486847
いよいよ本題
ようやく準備が整ったので順にデータを取得してみます。
まずはブロックの番号からトランザクションを取得します。
> eth.getTransactionFromBlock(7480083)
{
blockHash: "0x06dc646e88e5a6a07f173c899895decad86b86ee45ff24c9ff953061a19253b4",
blockNumber: 7480083,
from: "0x65f72c3f0c69625247d681ee845b0c92b0ec0c78",
gas: 25000,
gasPrice: 100000000000,
hash: "0x5053ad06a78ff9e676e4d7b8c55a31052c20048493ea8cd72a1ba7a74f3aa419",
input: "0x4a6170616e657365206e657720657261206e616d652069732052656977612e",
nonce: 6,
r: "0x34774c408681a723e5c6af0e6f08136fea9b1f92b5af6f48ad552530335a057c",
s: "0x597fa8922c1f2c90f5858080308ee23754554c26e59f5a3abacd645f1aa9ab54",
to: "0x035bfd7b6f512a07843ee369a931fbc23c7e6f1d",
transactionIndex: 0,
v: "0x26",
value: 1
}
16進数にエンコードされているためパッと見分からないですが、inputのところに目的の文字列が書かれています。
inputの項目は主にスマートコントラクトを実行するときに使用され、呼び出すメソッドや引数なんかが入っています。
通常のウォレット間の送金時には必須ではない項目なので、16進数にエンコードさえしていれば自由な値を入れることができます。
16進数の値をデコードするにはweb3.toUtf8()
を使用します。
> var tx = eth.getTransactionFromBlock(7480083)
undefined
> web3.toUtf8(tx.input)
"Japanese new era name is Reiwa."
いかがでしょうか?「令和」に出会えましたでしょうか?