当结构有两个以上参数时,带有 array.push() 的 Solidity 函数不起作用

Posted

技术标签:

【中文标题】当结构有两个以上参数时,带有 array.push() 的 Solidity 函数不起作用【英文标题】:Solidity function with array.push() not work when structure have more than two parameters 【发布时间】:2018-06-23 18:08:31 【问题描述】:

我已经通过 remix 将具有以下推送功能的合约部署到我的本地私有链。

struct TestComplex
    address testValue;
    address delegate;
    uint testInt;

TestComplex[] testArray;
function setTestArrayByPush( address _delegate, address _testAddr, uint _testInt) public 
    testArray.push(TestComplex( 
       testValue:_testAddr,
       delegate: _delegate,
       testInt: _testInt
     ));

如果我通过 web3Provider@remix 调用它,它可以正常工作,但是当我通过 geth 控制台或 JS 脚本contractInstance.setTestArrayByPush(<Add1>, <Add2>,<Int>) 调用它时,它不会将任何东西推送到数组中。 当我从 TestComplex 结构中删除一个属性并且函数更改如下。它适用于 geth 和 remix。

function setTestArrayByPush(address _testAddr, uint _testInt) public 
    testArray.push(TestComplex( 
       testValue:_testAddr,
       testInt: _testInt
       ));
    

所以我想知道 remix 函数调用和 geth 控制台有什么区别?我如何将两个以上的参数传递到我的 Dapp 中的 stuct 数组中?

【问题讨论】:

在你的 JS 中包含事务对象:contractInstance.setTestArrayByPush(<Add1>, <Add2>,<Int>,from: <FROM_ADDR>, gas: <GAS_LIMIT>)。如果这不能解决问题,请发布显示您创建 contractInstance 的代码以及合同的 structtestArray 部分。 @AdamKipnis 感谢您提供的信息!通过额外的带有gas费用的json后提交工作正常,非常感谢! @AdamKipnis 这里有一个问题:如何将 from: , gas: 放入 python 代码中? @AdamKipnis 我试过 web3.py 和 web3 一样工作 【参考方案1】:

这很好用:

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;


contract Test  

struct TestComplex
address testValue;
address delegate;
uint testInt;


TestComplex[] public  testArray;


 function setTestArrayByPush( address _testValue, address _delegate, uint _testInt) public 
testArray.push(TestComplex(
   _testValue,
   _delegate,
   _testInt
) );


function getTestComplex () public view returns ( TestComplex[] memory)  
return testArray ;

【讨论】:

以上是关于当结构有两个以上参数时,带有 array.push() 的 Solidity 函数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

仅当数组有两个或多个带有 angularjs ng-show 的项目时,如何显示元素?

[PHP]算法-队列结构的PHP实现

array.push 不是一个函数 - 当使用 reduce [重复]

pthread_create如何传递两个参数以上的参数

AngularJS:$ scope.array.push()不会更新视图,即使使用$ apply也是如此

Vue.js:尝试 Array.push 为一个 v-model 提供多个输入