Solidity

Solidity & truffle:從字元串數組中獲取元素

  • April 20, 2022

我很高興關注這個論壇,它非常有幫助。我正在使用 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()

引用自:https://ethereum.stackexchange.com/questions/67753