Поддерживает ли Solidity передачу массива строк конструктору контракта?

Я рассматриваю учебное пособие 2017 года, в котором говорится, что оно было обновлено в январе 2018 года. В нем говорится, что в настоящее время вы не можете передать массив строк непосредственно в конструктор контракта и что вам нужно использовать массив чего-то вроде byte32. Это все еще так?

Если вы можете использовать массив строк сейчас и у вас есть ссылка на страницу примера, пожалуйста, поделитесь ею.

Ответы (2)

На самом деле вы можете использовать массив byte32 в качестве аргумента функции солидности, как с этой функцией конструктора:

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

Если у вас есть возвращаемый тип byte32 в функции солидности, вы также можете использовать одну из служебных функций web3 (web3.utils.bytesToHex ('0xf2323de')), чтобы преобразовать его в строковое значение.

код конструктора взят из документов solidity: solidity.readthedocs.io/en/v0.5.0/solidity-by-example.html
Спасибо. Были ли у вас какие-либо проблемы с использованием тяжелого газа с функциями, которые принимают массив байтов 32 или ошибки «слишком большой стек»?
У меня не было проблем с использованием газа. В приведенном выше примере я использовал 6000000 Вэй для газа, и он работал нормально.

Действительно, вы не можете использовать массив строк или байтов32. Здесь уже был дан ответ;).