//tips
//smart contract
Remixにてcampaignコントラクトの作成の続き。
下記の記載でエラーが出てしまっているのでその要因を確認。
function createRequest(string description,uint value,address receipient)public restricted{
//requestインスタンス生成とリストへの追加
//生成に必要な引数を取る
Request newRequest=Request({
description:description,
value:value,
receipient:receipient,
complete:false//この段階ではまだ許可されていないので
});
これはデータ格納場所がstorageかmemoryかに関連するよう。
storage:ハードウェアに保存、シャットダウンしても保存されている
Memory:データの一時保管場所でシャッドダウンすると消えてしまう。
定義している変数はstorageデータだが、引数のminimumはmemoryとなる。
面白いことに
int public numbers;[20,30]
function Numbers()public{
Int storage myArray=numbers;
myArray[0]=1;
//この場合はnumbers[0]が1となる。
//myArrayはnumbersを参照しアクセスするものとなってしまう
Int memory myArray=numbers;
myArray[0]=1;
//この場合はnumbers[0]が20となる。
//myArrayはnumbersとは別の変数として認識される。
}
Memoryはnumbersをコピーして別のものを生成していることになる。
なので、 Request memory newRequest=Request({とする必要があった。
ここからはapproverequest以下の実装に入る。
ただ、もしapproverequestで、以前に投票をしているか、donateを完了しているかなどを確認したい場合にloopを使うとgas費用がとんでもないことになってしまうので工夫が必要。
この問題を解決するのにarrayではなくmappingを使用する。
mappingはaddress=>boolの形でとる。
mapping(address=>bool) public approvers;
function contribute() public payable{
require(msg.value>minimumContribution);//寄付最低額の制約
approvers[msg.sender]=true;//mappingへの追加方法
//approvers.push(msg.sender);//approversリストへ追加
}
function createRequest(string description,uint value,address receipient)public restricted{
require(approvers[msg.sender]);//これによりloop機能が必要なくなる
これは革命的な仕組みだった。
さらに投票処理approveRequestに踏み込んでいく。
uint approvalCount;//リクエストを承認した人数
mapping(address=>bool)approvals;//approversとは異なるので注意。誰が投票したか。
function approveRequest(uint index)public{//と投票の実行
require(approvers[msg.sender]);//donateしているか確認
require(!requests[index].approvals[msg.sender]);//2度投票していないか確認
requests[index].approvals[msg.sender]=true;
requests[index].approvalCount++;//index番のrequestの参加人数を増やす
}
さらに先のstorageの知識を使い、
function approveRequest(uint index)public{//と投票の実行
Request storage request=requests[index];
require(approvers[msg.sender]);//donateしているか確認
require(!request.approvals[msg.sender]);//2度投票していないか確認
request.approvals[msg.sender]=true;
request.approvalCount++;//index番のrequestの参加人数を増やす
}
このように簡略化する。