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