Solidity:在智能合约中填充结构



我创建了一个存储一些不同变量的结构,并填充它,但字符串没有存储。这是我的智能合约:

struct voter {
uint ID;
string firstName;
string lastName;
}
contract Poll {
uint public numVoters;
function AddVoter(string memory _firstName, string memory _lastName) public returns 
(voter memory)
{
numVoters++;
voter memory _voter = voter(numVoters, _firstName, _lastName);
_voter.ID = numVoters;
_voter.firstName = _firstName;
_voter.lastName = _lastName;
return _voter;
}
}

当我使用truffle:运行javascript测试时

it('Poll 1 : create voter and candidate objects2', async () => {

const JJ = await poll.AddVoter('Jack', 'Jackson', 0, '');
assert.equal(JJ.firstName, 'Jack');
});

我得到这个错误行:

合同:BVT投票1:创建投票人和候选人对象2:AssertionError:预期未定义为等于"Jack">

有两个问题:

  1. AddVoter收到两个参数,但给出了四个。

  2. 您不能使用链外代码中智能合约的返回值。。。只有链上的其他智能合约才能使用返回的值。因此,另一种选择是发出一个事件。这样,您就可以访问新创建的投票。在这种情况下,你的合同会是这样的:

    struct voter {
    uint ID;
    string firstName;
    string lastName;
    }
    contract Poll {
    uint public numVoters;
    event VoterAdded(
    voter newVoter
    );
    function AddVoter(string memory _firstName, string memory _lastName) public returns 
    (voter memory)
    {
    numVoters++;
    voter memory _voter = voter(numVoters, _firstName, _lastName);
    _voter.ID = numVoters;
    _voter.firstName = _firstName;
    _voter.lastName = _lastName;
    emit VoterAdded(_voter);
    return _voter;
    }
    } 
    

测试代码如下所示:

it('Poll 1 : create voter and candidate objects2', async () => {  
const tx = await poll.AddVoter('Jack', 'Jackson');
const reciept = await tx.wait();
const [ VoterAdded ] = reciept.events || [];
const result = [...(VoterAdded.args || [])]; 
const JJ = result[0];
assert.equal(JJ.firstName, 'Jack');
});

注意:有一些变通方法代码可以与Typescript,兼容,但它也可以在Javascript中运行。

最新更新