Solidity
Solidity & truffle:從字元串數組中獲取元素
我很高興關注這個論壇,它非常有幫助。我正在使用 truffle 來開發契約,我只是發現動態數組尚未得到支持,因此我使用的是固定長度的字元串數組,我發現索引為 0 的元素沒有顯示任何內容,最後一個說未定義. 你知道這是什麼原因嗎?,我必須以不同的方式獲取元素嗎?
這是solidity中的功能:
pragma solidity ^0.4.21; pragma experimental ABIEncoderV2; contract Example { function getStringArray() public returns (string[]) { string[] memory resultStr = new string; resultStr[0] = "355555555"; resultStr[1] = "2"; resultStr[2] = "8888"; return resultStr; } }
我還用這樣的松露做了一個測試:
在javascript中,我一個一個地測試獲取元素,我得到了這個:
var ExampleCont = artifacts.require("Example"); contract('ExampleCont', async(accounts) => { before(async () => { ExampleContract = await ExampleCont.new(); }); it('Upload File', async () => { let stringArray = await ExampleContract.getStringArray.call(); console.log("list size=" + stringArray.lenght+"0=" + stringArray[0] + "1="+stringArray[0]+", 2=" + stringArray[1] + "3=" + stringArray[2]); } }
列表大小=3,值 0=,1=355555555,2=2,3=未定義
關於這種情況下發生了什麼的任何想法?,我如何使用字元串數組很好地獲取所有元素?
我相信這在 Solidity 中尚不可用(具有字元串數組)。因為solidity中的string是字節數組,現在如果你看到string的處理
$$ $$變成 2 d 數組字節$$ $$$$ $$到目前為止,這是 Solidity 的一個限制。
我使用 ABIEncoderv2 和solidity v0.5.0,下面的程式碼完美執行。
function _getStringArray() public view returns (string[] memory) { string[] memory resultStr = new string[](3); resultStr[0] = "355555555"; resultStr[1] = "2"; resultStr[2] = "8888"; return resultStr; }
JavaScript 從這裡開始。我使用了“web3 ^1.0.0-beta.36”。我已經在 Kovan 網路中進行了測試,因此請使用您的 kovan INFURA 配置來查看它是否有效。這是我現在能做的。
const ABI = [{"constant":true,"inputs":[],"name":"_getStringArray","outputs":[{"name":"","type":"string[]"}],"payable":false,"stateMutability":"view","type":"function"}]; const infuraUrl = "INFURAURL"; const infuraKey = "INFURAKEY"; const web3 = new Web3(infuraUrl+infuraKey) ReactDOM.render( <div id ="test"></div>, document.getElementById('app') ); module.hot.accept(); function integrateContract() { return new Promise(function (resolve, reject) { var contract = new web3.eth.Contract(ABI, "0x9fb7ba497a7572cc3234c5d0ae4dddc08d7bc1c0"); resolve(contract); }); } function getList(){ integrateContract().then(instance => { console.log({instance}) instance.methods._getStringArray().call().then(res=> { document.getElementById("test").append(res) }) }); } getList()