Ethereum 在坚固性方面是否有类似于零的东西
如果买方未记录在买方映射中,则buyerNum++;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
但我不知道如何判断买家是否在映射中在稳健性方面没有比
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.
}