首页 > 解决方案 > 预期的主要表达(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));   
    }
}

}

标签: mappingethereumsoliditysmartcontracts

解决方案


有几个问题。主要问题是您拼写错误!=。(你有一个额外的等号。!==是 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;
    }
}

推荐阅读