課題:マッピング(mapping)に2つの鍵(key)を持ちたい
鍵(key)と値(Value)を1:1で紐づけて記録しておき、鍵から値を検索できるという便利な仕組み「mapping」ですが、mappingはその仕様上、鍵をひとつしか許容しません。
しかし、実際の開発においては、鍵を2つ許容してほしい場面があります。
例えば、アンケート機能を作りたい場合、各ユーザーは一度しかそれぞれのアンケートに回答できないようにしておきたいところ。
このとき、(1)回答者のウォレットアドレスと(2)アンケートのIDを鍵として、アンケートに回答済みかどうか(true/false)を値として、mappingに保有しておきたいというケースが生じます。
解決策:2つの鍵をあわせてハッシュ化したものを鍵にする
解決策
上述のケースは、2つの鍵をあわせてハッシュ化したものを鍵にすることで解決します。
Solidityにおいては、keccak256()でハッシュ化できます。ハッシュ値はbytes32型です。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//bytes32型のハッシュ値をmappingの鍵にする mapping(bytes32 => bool) public questionToBool; //2つの鍵を統合してハッシュ化する部分は関数を作っておくと便利 function _combineWithSender(_questionId) internal returns(bytes32) { return keccak256(abi.encodePacked(msg.sender, _questionId)) } //mappingを利用する function answerQuestion(_questionId, _answer) public { //未回答であることを確認 require(questionToBool[_combineWithSender(_questionId)] == false); /*アンケート回答に関する処理は別途記述*/ //mappingを回答済み(true)に変更 questionToBool[_combineWithSender(_questionId)] = true; } |
コメントを残す