Solidity 中是不是有类似 null 的东西

Posted

技术标签:

【中文标题】Solidity 中是不是有类似 null 的东西【英文标题】:Are there null like thing in soliditySolidity 中是否有类似 null 的东西 【发布时间】:2016-10-17 14:04:46 【问题描述】:
    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++; 但我不知道如何判断买家是否在映射中

【问题讨论】:

在 Ethereum Stack Exchange 上可能像 How can I check if a variable or an array is set or empty or null、Checking zero value of structure 或 What is the zero value for a string? 【参考方案1】:

您可以检查bytebyte 大小,而不是使用其中一个值或创建额外的boolean

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

【讨论】:

【参考方案2】:

对于整数:

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

uint256 constant NULL = 0;

检查示例代码:

function isNULL(uint256 variable) internal returns (bool) 
    return variable == NULL;


对于bytes32

对于bytes,您可以采用不同的方法:

bytes32 constant NULL = "";

示例代码片段:

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;


我观察到,在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\x00\x00'

【讨论】:

【参考方案3】:

正如 Viktor 所说,映射中所有可能值的默认值为零。因此,如果 buyer 尚未插入映射中,则该 addressamount 值将为零。但是这种方法有一个缺陷,如果一个buyer确实存在,但是经过一些操作后它的余额变为零,你会认为它不存在。

我认为最好的方法是将exists 成员添加到具有bool 类型的buyer 结构。此成员的默认值为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

【讨论】:

【参考方案4】:

默认情况下,每个变量都设置为0

您应该认为mappings 所有可能的组合默认设置为0

在您的具体情况下,我会使用以下内容:

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

【讨论】:

你也可以直接说:if (buyers[msg.sender].amount) ... 【参考方案5】:

没有什么比 null 更可靠了。

只检查地址的长度:

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

另见this answer on ethereum stack exchange。

【讨论】:

结构没有length 成员。

以上是关于Solidity 中是不是有类似 null 的东西的主要内容,如果未能解决你的问题,请参考以下文章

Solidity之Mappings篇

如何检查变量是不是为数组?...或类似数组的东西

Solidity遍历

Solidity 和 Web3 sha3() 方法返回别的东西

Visual Studio 代码中是不是有 Solidity 文件的文档格式化程序扩展?

检查数组是不是包含javascript中的null以外的内容?