Contract-Deployment
Solidity 是否支持將字元串數組傳遞給合約的建構子?
我正在閱讀 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’))將其轉換為字元串值。