создание экземпляра контракта web3

Я пытаюсь создать contractобъект с помощью web3.

      var contract_abi = result['contracts']['Test']["interface"];

//[{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}];

var contract = new web3.eth.Contract(contract_abi);

Однако я продолжаю получать сообщение об ошибке:

Uncaught Error: You must provide the json interface of the contract when instantiating a contract object.

Однако, если я скопирую свой вывод консоли contract_abi и напрямую создам такую ​​переменную:

var contract_abi =
[{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}];

Оно работает. В чем дело? Спасибо

Ответы (4)

Я не уверен, что ваш аби правильный. Но я пишу способ взаимодействия со смарт-контрактом и создания аби из исходного кода.

Генерация abi из исходного кода:

  • Вставьте свой код в компилятор солидности remix-online.
  • Нажмите «Пуск», чтобы скомпилировать ваш код.
  • Если ваш код успешно скомпилирован. Нажмите на Detailsвкладку в правом верхнем углу
  • Вы получите список свойств, включая abi, скопируйте abi оттуда.

Доступ к контракту с помощью web3:

  • Инициализировать экземпляр web3

  • Используйте следующий код, чтобы получить экземпляр контракта.

//For web3 versions 0.20.x
var contract = web3.eth.contract(contractAbi).at(contractAddress);
//For web3 1.0.x
var contract = new web3.eth.Contract(contractAbi,contractAddress);

Надеюсь это поможет!

Пожалуйста, какая версия web3? По крайней мере, в последней версии этого метода contractне существует, он не указан в документации по API . Есть только класс Contract, поэтому необходимо newключевое слово, как @user339946, используемое в описании вопроса.

Я только что столкнулся с этой проблемой и смог решить ее, запустив JSON.parse() для результата интерфейса, поэтому в вашем случае это будет что-то вроде:

var contract_abi = JSON.parse(result['contracts']['Test']["interface"])

причина, по которой копирование вывода вашей командной строки и установка его в переменную работает, заключается в том, что когда вы копируете его, вы технически меняете его из строки в объект, что и делает JSON.parse :)

Это должен быть принятый ответ.

Для меня я не извлекал объект abi из скомпилированного файла json.

это сработало:

var erc20ABI = JSON.parse(fs.readFileSync(file+"DummyERC20.json"));
var abi = erc20ABI.abi #essential
ERC20DummyContract = new web3.eth.Contract(erc20ABI, erc20Address);
Добавление .abi исправило это для меня на1.0.0-beta.37

У меня была такая же проблема. Если вы используете web3@1.0 и JavaScript, вам, вероятно, потребуется запустить ABI с помощью JSON.parse().

Проверьте эту ссылку