Contract-Deployment

Solidity 是否支持將字元串數組傳遞給合約的建構子?

  • November 18, 2018

我正在閱讀 2017 年的教程,該教程說它在 2018 年 1 月更新。它說目前你不能將字元串數組直接傳遞給合約的建構子,你必須使用類似 byte32 的數組。還是這樣嗎?

如果你現在可以使用一個字元串數組並且你有一個範例頁面的連結,那麼請分享它。

實際上,您可以使用 byte32 數組作為solidity 函式的參數,就像這個建構子一樣:

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
       }));
   }
}

這就是您可以使用 web3 傳遞它的方式:

let args = ['one', 'two', 'three', 'four'];
ballot = await new web3.eth.Contract(JSON.parse(interface))
   .deploy({ 
       data: bytecode, 
       arguments: [args.map((arg) => web3.utils.asciiToHex(arg))]
   })
   .send({ from: accounts[0], gas: '6000000' });

關鍵是將字元串數組轉換為 byte32 數組(十六進製表示),然後將其傳遞。我為獲得十六進製表示所做的唯一事情是:

args.map((arg) => web3.utils.asciiToHex(arg))

如果您在solidity 函式中有一個byte32 返回類型,您同樣可以使用web3 的實用函式之一(web3.utils.bytesToHex(‘0xf2323de’))將其轉換為字元串值。

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