Ethereum 在坚固性方面是否有类似于零的东西

Ethereum 在坚固性方面是否有类似于零的东西,ethereum,solidity,contract,Ethereum,Solidity,Contract,如果买方未记录在买方映射中,则buyerNum++; 但我不知道如何判断买家是否在映射中在稳健性方面没有比null更好的了 只需检查地址的长度: struct buyer{ uint amount; Status status; } mapping(address=>buyer) public buyers; mapping(uint=>address) buyerIndex; uint public buyerN

如果买方未记录在买方映射中,则buyerNum++;
但我不知道如何判断买家是否在映射中

在稳健性方面没有比
null
更好的了

只需检查地址的长度:

    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);

 }
有关整数,请参见。

: 您可以创建
none
变量,将其用作
NULL

if(buyers[msg.sender].length == 0){
    // do your thing
}
检查的示例代码:

uint256 constant NULL = 0;

对于字节32: 对于
字节
,您可以采用不同的方法:

function isNULL(uint256 variable) internal returns (bool) {
    return variable == NULL;
}
示例代码块:

bytes32 constant NULL = "";

我观察到,在solidity>=
v0.6.0
上,它可能返回32作为长度,即使它没有映射

其返回值的示例:


b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
默认情况下,每个变量的实度都设置为
0

您应该考虑
映射
,因为默认情况下,所有可能的组合都设置为
0

在您的具体情况下,我将使用以下方法:

pragma solidity ^0.6.0;

mapping(address => bytes32) public Countries;   

function isCountriesInitialized(address _user) external view returns (bool) 
{
    if (Countries[_user] == NULL) // Returns true if `Countries[_user]` is not initialized
        return false;

    return true;
}

正如Viktor所说,映射中所有可能值的默认值都是零。因此,如果
买家
尚未插入映射,则该
地址的
金额
值将为零。但是这种方法有一个缺陷,如果一个
买家确实存在,但在一些操作后其余额变为零,那么您会将其视为不存在

我认为最好的方法是使用
bool
类型将
exists
成员添加到
buyer
结构中。此成员的默认值为
false
,在创建买家时,您可以使用
true
值对其进行初始化。因此,您可以通过该会员检查是否存在买家

买方结构:

if (buyers[msg.sender].amount == 0)
初始化买方:

struct buyer{
   uint amount;
   Status status;
   bool exists;
}
检查买方是否存在:

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

您可以检查
结构的
字节大小,而不是使用其中一个值或创建额外的
布尔值

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

可能像,或者在以太坊堆栈交换中?您也可以说:
if(买家[msg.sender].amount){…}
Structs没有
length
成员。
if (bytes(buyers[msg.sender]).length > 0) {
    // buyer exists.
}