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】:您可以检查byte
的byte
大小,而不是使用其中一个值或创建额外的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
尚未插入映射中,则该 address
的 amount
值将为零。但是这种方法有一个缺陷,如果一个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 和 Web3 sha3() 方法返回别的东西