mapping - 预期的主要表达(Solidity)
问题描述
我正在创建一个简单的智能合约,但是,我的最后一个函数(“ViewNotes”)出现错误,指出编译器是“预期的主表达式”?我不能对照值0检查映射(地址 => 字符串)的值吗?
我的代码:
pragma solidity ^0.4.4;
contract Logistics{
address public owner;
mapping(address => string) notes;
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
constructor(address genesis) public {
owner = genesis;
}
function sign(string signedNote) public onlyOwner{
notes[owner] = signedNote; //gaurenteed that msg.sender == owner
}
function transferOwnership(address nuOwner) onlyOwner {
owner = nuOwner;
}
function viewNotes(address participant) public returns(string){ // signed note on success nothing on fail
if(notes[participant] !== 0){
return (notes(participant));
}
}
}
解决方案
有几个问题。主要问题是您拼写错误!=
。(你有一个额外的等号。!==
是 JavaScript 中的运算符,但在 Solidity 中不是。)
一旦你解决了这个问题,你会发现你无法将 astring
与 number进行比较0
。您可能想检查字符串的长度?你需要强制转换bytes
来做到这一点:
function viewNotes(address participant) public returns (string) {
if (bytes(notes[participant]).length != 0) {
return notes[participant];
}
}
也就是说,我相信这可能相当于:
function viewNotes(address participant) public returns (string) {
return notes[participant];
}
你可以改为notes
public
:
mapping(address => string) public notes;
这样,Solidity 会为你生成一个 getter 函数,人们只需调用notes(addr)
,就可以了viewNotes
。
修复了一些其他警告,摆脱了有利于直接所有权检查的修饰符,并将初始所有权分配给部署者,这是我对合同的看法:
pragma solidity ^0.4.24;
contract Logistics{
address public owner = msg.sender;
mapping(address => string) public notes;
function sign(string note) public {
require(msg.sender == owner);
notes[owner] = note;
}
function transferOwnership(address newOwner) public {
require(msg.sender == owner);
owner = newOwner;
}
}
推荐阅读
- python - Python:如何从大字典中存在的 2 个键生成 DataFrame
- ruby-on-rails - RoR:模型之间的关联
- android-studio - 无法在 Android Studio 上登录 GitHub
- sql - 如何在sql每个select语句中使用union排序
- c++ - C++/Raspberry Pi/Mosquitto API:尝试使用 Mosquitto 向 MQTT 代理发布字符串消息,但不断出现无法访问的内存错误
- django - DRF 序列化器,不同的字段类型
- ionic-framework - 为什么 ion-icon 没有在 ionic vue 项目中显示?
- reactjs - 从 react-jsonschema-form 获取更新的字段值
- c - C中整数的无符号和后缀
- sql - 在 JSONB 列 POSTGRES 上选择 DISTINCT