当结构有两个以上参数时,带有 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
的代码以及合同的 struct
和 testArray
部分。
@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 的项目时,如何显示元素?
array.push 不是一个函数 - 当使用 reduce [重复]