前回作成した重要な情報を扱うスマートコントラクトの動作確認を行います。
アカウントごとの役割
今回の動作確認では、アカウントの役割は重要ではないのですが、一応次のようにしておきます。
- ACCOUNT3 (eth.accounts[3])
コントラクト生成者。
- ACCOUNT1 (eth.accounts[1])
マイナー。
デプロイ
まずはデプロイを行います。デプロイアカウントはアカウント3です。
デプロイするのはSecretで、コンストラクタパラメータにはtestを設定します。
[デプロイ]
デプロイ後のコントラクトの状態を確認します。
[コントラクト状態]
さすがにこの画面からはsecretにどんな文字が設定されているかは確認できません。
(privateで宣言しているため)
トランザクションの確認
コントラクトを生成したときのハッシュを確認します。
[トランザクションの確認]
このトランザクション・ハッシュを引数にして、トランザクションのinputというフィールドを確認します。
gethコンソールから次のコマンドを実行します。
[トランザクションのinputフィールド確認]
1 2
| > eth.getTransaction('0xd34e1aa86318225a66a77399f95a835b250ac75139c1c01eb2a80d3636238939').input "0x6060604052341561000c57fe5b604051610263380380610263833981016040528051015b805161003690600090602084019061003e565b505b506100de565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061007f57805160ff19168380011785556100ac565b828001600101855582156100ac579182015b828111156100ac578251825591602001919060010190610091565b5b506100b99291506100bd565b5090565b6100db91905b808211156100b957600081556001016100c3565b5090565b90565b610176806100ed6000396000f300606060405263ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416637ed6c926811461003a575bfe5b341561004257fe5b610090600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284375094965061009295505050505050565b005b80516100a59060009060208401906100aa565b505b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100eb57805160ff1916838001178555610118565b82800160010185558215610118579182015b828111156101185782518255916020019190600101906100fd565b5b50610125929150610129565b5090565b61014791905b80821115610125576000815560010161012f565b5090565b905600a165627a7a72305820548d2d70ba56a4626512317eed38e749eae8a73a9d5322c580ebab786f1c12d90029000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000"
|
前半部分はコンパイルされたコントラクトのコードですが、後半部分のゼロに囲まれた474657374に注目してみます。
実は、この部分の最初の4はバイト数を表し、その直後の74657374(4バイト)はコントラクトで設定された文字列を表しています。
試しにこのデータをアスキーに変換してみます。
[アスキー変換]
1 2
| > web3.toAscii("0x74657374") "test"
|
なんとprivateで設定した文字列”test”が簡単に見れてしまいました。
文字列を更新
setSecret関数をコールして、文字列をkoushinに変更します。
[文字列の確認]
再度、トランザクションのハッシュから、inputフィールドを確認します。
[トランザクションのinputフィールド確認]
1 2
| > eth.getTransaction('0x1bf2c055abc6e5d0f861c64c52c7a84419c4b80a41edbf954bce7c78b4147392').input "0x7ed6c926000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000076b6f757368696e00000000000000000000000000000000000000000000000000"
|
また後半部分のゼロに囲まれた76b6f757368696eに注目してみます。
最初の7はバイト数を表し、6b6f757368696e(7バイト)は更新した文字列を表しています。
このデータをアスキーに変換してみます。
[アスキー変換]
1 2
| > web3.toAscii("0x6b6f757368696e") "koushin"
|
更新した文字列を確認することができました。
まとめ
privateな変数を宣言しても、トランザクションの中身を確認すれば簡単にそのデータを確認できるということが分かりました。
Ethereumではトランザクションが暗号化されないため、中身を参照すればどんなデータか確認することができるのです。
個人情報のような重要な情報をステートに設定する場合は、暗号化するなどの処理を行うようにしましょう。