预期的主要表达(Solidity)
Expected Primary Expression (Solidity)
我正在创建一个简单的智能合约,但是,我在最后一个函数 ("ViewNotes") 中遇到错误,指出编译器是 "Expected Primary Expression"?我可以不根据值 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。)
修复该问题后,您会发现无法将 string
与数字 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;
}
}
我正在创建一个简单的智能合约,但是,我在最后一个函数 ("ViewNotes") 中遇到错误,指出编译器是 "Expected Primary Expression"?我可以不根据值 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。)
修复该问题后,您会发现无法将 string
与数字 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;
}
}