Развертывание контракта с параметрами с помощью web3.js и Node.js

Я пытаюсь развернуть контракт ERC721. Это от OpenZeppelin.

Моему конструктору контракта нужны два поля входной строки.

constructor(string _name, string _symbol) public {
    name_ = _name;
    symbol_ = _symbol;

    // register the supported interfaces to conform to ERC721 via ERC165
    _registerInterface(InterfaceId_ERC721Enumerable);
    _registerInterface(InterfaceId_ERC721Metadata);
}

Однако, когда я развертываю контракт, он говорит мне, что параметры, которые я устанавливаю, должны быть данными в кодировке HEX.

Это сообщение об ошибке, которое я получил:/Users/amos_mac/721_server/node_modules/solc/soljson.js:1 (function (exports, require, module, __filename, __dirname) { var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!

Error: The data field must be HEX encoded data.

Так что я использовал web3.utils.asciiToHex(), но это не помогает.

Вот мой код развертывания контракта:

MyToken.deploy({
    arguments: [[web3.utils.asciiToHex('Top 10 Students')],[web3.utils.asciiToHex('Top10')]]
}).send({
    from: address,
    gasPrice: gasPrice,
    gas: gas + 500000
}).then((instance) => {
    console.log("Contract mined at " + instance.options.address);
});

Пожалуйста помоги! Большое спасибо!


Проверив свой код, я понял, что добавил в свой байт-код дополнительный «0x». Вот что вызывает ошибку.

попробуй заменить arguments: [[web3.utils.asciiToHex('Top 10 Students')],[web3.utils.asciiToHex('Top10')]]наarguments: [web3.utils.asciiToHex('Top 10 Students'),web3.utils.asciiToHex('Top10')]
Привет Хенк, спасибо за оставленный комментарий. Я пробовал arguments: [web3.utils.asciiToHex('Top 10 Students'),web3.utils.asciiToHex('Top10')], но все равно получаю ту же ошибку.Error: The data field must be HEX encoded data.

Ответы (1)

В документации web3.eth.Contract.deploy указано, что вы должны предоставить байт-код скомпилированного смарт-контракта вместе с аргументами:

MyToken.deploy({
    data: '0x[INSERT THE BYTECODE HERE]',
    // You can omit the asciiToHex calls, as the contstructor takes strings. 
    // Web3 will do the conversion for you.
    arguments: ['Top 10 Students','Top10'] 
}).send({
    from: address,
    gasPrice: gasPrice,
    gas: gas + 500000
}).then((instance) => {
    console.log("Contract mined at " + instance.options.address);
});
Хенк, еще раз спасибо. Я предоставил свой байт-код при объявлении своего контракта: let MyToken = new web3.eth.Contract(JSON.parse(abi), null, { data: '0x' + bytecode, });извините, что не указал это в своем вопросе.
Сам по себе начинается bytecodeс 0x? я
Ах! Я никогда не замечаю, что уже добавил 0x в байт-код! Большое спасибо!