web-dev-qa-db-ja.com

堅牢性にヌルのようなものがありますか

    struct buyer{
       uint amount;
       Status status;
    }

    mapping(address=>buyer) public buyers;
    mapping(uint=>address) buyerIndex;
    uint public buyerNum;
    //Order a product.
    function(){
      uint doubleValue=value*2;
      uint amount=msg.value/doubleValue; 
      if(buyers[msg.sender]==null){ //Error in this line
      buyer abuyer=buyer({amount:amount,status:Status.Created}); //Error in this line
      buyerNum++;
      buyerIndex[buyerNum]=msg.sender;
      buyers[msg.sender]=abuyer;
    }else{
      buyers[msg.sender].amount+=amount;
    }
      Order(msg.sender,amount*doubleValue,amount);

 }

バイヤーがバイヤーマッピングに記録されていない場合、buyerNum ++。しかし、買い手がマッピングに含まれているかどうかを知る方法がわかりません

18
Hao WU

Solidityでは、すべての変数はデフォルトで0に設定されています。

mappings可能な限りの組み合わせはデフォルトで0に設定されていると考えてください。

あなたの特定のケースでは、私は次を使用します:

if (buyers[msg.sender].amount == 0)
8
Viktor Camp

none変数を作成して、NULLとして使用できます。

uint80 constant NULL = uint80(0);

7
alper

nullのような堅実性はありません。

住所の長さを確認してください:

if(buyers[msg.sender].length == 0){
    // do your thing
}

イーサリアムスタック交換に関するこの回答 も参照してください。

2
Waqar Lim

Viktorが言ったように、マッピングで可能なすべての値のデフォルト値はゼロです。したがって、buyerがまだマッピングに挿入されていない場合、そのamountaddress値はゼロになります。しかし、このアプローチには欠点があります。buyerは存在するが、何らかの操作の後にバランスがゼロになった場合、存在しないものとして扱います。

最善のアプローチは、exists型のbuyer構造体にboolメンバーを追加することだと思います。このメンバーのデフォルト値はfalseであり、バイヤーが作成されると、true値で初期化します。そのため、このメンバーを介してバイヤーが存在するかどうかを正確に確認できます。

バイヤー構造:

struct buyer{
   uint amount;
   Status status;
   bool exists;
}

購入者の初期化:

buyer memory b = buyer(0, status, true);

バイヤーが存在するかどうかを確認します。

if(buyers[msg.sender].exists) {
  //so can buy
}
2

値の1つを使用したり、追加のブール値を作成したりする代わりに、構造体のバイトサイズを確認できます。

if( bytes( buyers[msg.sender] ).length > 0 ) {
    // buyer exists
}
1
einaralex