Solidity:提交字符串数组,键值对或对象作为函数的参数

时间:2018-11-18 16:59:48

标签: ethereum solidity web3js

为了从前端输入更改智能合约的状态,希望将字符串数组提交给智能合约,键值对或对象。

是否可以使用字符串数组作为参数?

2 个答案:

答案 0 :(得分:1)

没有坚固性不支持将字符串数组作为参数。您必须自己对字符串进行序列化和反序列化才能获得所需的结果,但是要实现这种效果将非常昂贵。您可以根据需要在混音上进行测试。但是,在重新混音时,错误消息表明experimental ABI encoder支持此功能,但我从未测试过该功能,或与其他库配合使用的效果如何,并且毕竟是试验性的。

答案 1 :(得分:0)

从下面的示例中可以看到,我们可以将字节数组发送给构造函数

constructor(bytes32[] memory proposalNames) public {
    chairperson = msg.sender;
    voters[chairperson].weight = 1;

    // For each of the provided proposal names,
    // create a new proposal object and add it
    // to the end of the array.
    for (uint i = 0; i < proposalNames.length; i++) {
        // `Proposal({...})` creates a temporary
        // Proposal object and `proposals.push(...)`
        // appends it to the end of `proposals`.
        proposals.push(Proposal({
            name: proposalNames[i],
            voteCount: 0
        }));
    }
}

如果您尝试专门发送字符串/对象数据,则最好分离出方法并分别或在彼此之间调用每个方法,因为当前的坚固性不支持该方法(使用ABIencodere v2是例外,因为仅建议将其用于开发目的-根据撰写此答案之日的信息

struct A{
uint date,
B[] b
}

您可以将其分离为

struct A{
uint date
}
struct B{
string goods,
uint quantity
}

因此,对于1 A,您现在可以通过服务呼叫NB。使用映射将两者绑定(如果有的话)。

在当前情况下,最好设计一个不接受大量投入或不提供大量产出的合同。但是,合同不是为了存储海量数据,而是为了存储满足双方协议的相关数据