预期的主要表达(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;
    }
}