API в Node.js для смарт-контракта Solidity

Как сделать API для смарт-контракта Ethereum в Node.js? Может ли кто-нибудь отправить хорошие примеры? Является ли это вообще стандартным способом создания API в Node.js, чтобы он мог взаимодействовать с любым интерфейсом, потому что большинство примеров, которые я могу найти, работают только из внешнего интерфейса? Я сделал код с помощью web3, показывает ожидаемый результат, но ничего не фиксирует в новом блоке, как это происходит с трюфелем. Мой код-

var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
console.log("Talking with a geth server", web3.version.api);

function test(){
  var sourceCode = fs.readFileSync('contracts/digitalToken.sol','utf8')
  var compiled = solc.compile(sourceCode);
  console.log(compiled.contracts[":digitalToken"]);
  var abiArray = compiled.contracts[":digitalToken"].interface;
  abiArray = JSON.parse(abiArray);
  var MyContract = web3.eth.contract(abiArray);
  var address = "0x1f81b5fa31d049b70556628cc01f22d362c41084";
  var contractInstance = MyContract.at(address);
  console.log(contractInstance);
  var value=executeAddvid(contractInstance)
      console.log({message: "Success",value:value});
      console.log('after passing--');
      console.log({message: "Success",value:value});
  var value1=readVidByUser(contractInstance);
    console.log({message: "Success",value:value1});
      console.log('after passing--');
      console.log({message: "Success",value:value1});


}

function executeAddvid(contractInstance){
  record = contractInstance;
  return record.addVid.call('0x0000000000000000000000000000000000000124',5,"ronaldo","0xc9f5a0572d95d5dea1331edcc192dacef51ecbb7",1000000000000000000);
}

function readVidByUser(contractInstance){
  record = contractInstance;
  return record.readVidByUser.call('0x0000000000000000000000000000000000000124','0x1f81b5fa31d049b70556628cc01f22d362c41084');
}


test();

Ответы (3)

Совсем недавно мы создали API в node.js. Вы можете взглянуть на это репо для справки -

https://github.com/Imaginea/lms/blob/master/server/routes.js

Пользовательский интерфейс взаимодействует с промежуточным ПО node.js, а затем промежуточное ПО взаимодействует с узлом Ethereum.

По сути, вам придется использовать библиотеку Web3JS для ее реализации, пожалуйста, проверьте код для получения более подробной информации.

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

Эй, я посмотрел на ваш код, спасибо за это, это в значительной степени то, что я делаю ... Я использую модуль web3, и мои транзакции смарт-контракта выполняются и возвращают ожидаемый результат, но проблема в том, что когда я запрашиваю их обратно или делаю дальше выполнения функций на основе предыдущих, это действует так, как будто предыдущее выполнение функций никогда не имело места. в чем может быть причина... как будто транзакции не фиксируются в блокчейне.
Вы развертываете смарт-контракт с помощью трюфеля или полностью используете web3? Если вы видите код, которым я поделился, значит, мы не развернули контракт с помощью web3, а развернули его с помощью truffle и сохранили адрес развернутого контракта в каком-то файле. Вы делаете так же?
СДЕЛАЛ так же, как и вы, развернул отдельно, а затем использовал полученный адрес контракта в качестве жестко закодированного значения в приложении узла.
Затем я могу прокомментировать проблему, если я посмотрю код. Было бы здорово, если бы вы могли обновить вопрос с некоторой частью вашего кода.
Это мои журналы для test-rpc, когда я выполнял выполнение через truffle, это давало дополнительный блок в результате с хэшем транзакции. Но когда я делаю то же самое с узлом, он просто дает мне эти вызовы в виде журнала, но не создает новый блок.
Transaction: 0x10de5b2138a10fbde58073a88d795cf21426228f3e6356f9a9ac59e9a07c3578 Gas usage: 57172 Block Number: 15 Block Time: Mon Jul 03 2017 13:28:43 GMT+0530 (IST) eth_getTransactionReceipt net_version eth_call net_version eth_call eth_call eth_call eth_call eth_call eth_call eth_call eth_call eth_call net_version eth_call eth_call eth_call eth_call eth_call eth_call net_version eth_accounts eth_getBalance
Обновил вопрос.
Взглянув на код, я бы порекомендовал вам еще раз внимательно посмотреть на мой код и увидеть, как мы используем артефакты трюфелей напрямую для получения ABI контракта.

Ознакомьтесь с модулем web3 npm. Все есть.

Я использую модуль web3, и мои транзакции смарт-контракта выполняются и возвращают ожидаемый результат, но проблема в том, что когда я запрашиваю их обратно или выполняю дальнейшие функции на основе предыдущих, он действует так, как будто предыдущее выполнение функциональности никогда не выполнялось. . в чем может быть причина... как будто транзакции не фиксируются в блокчейне.
Похоже, проблема с вашей тестовой цепочкой. Что вы используете для этого?
Мы используем сеть test-rpc, проверили смарт-контракт через truffle. Вот забавный момент: если я выполняю какое-либо выполнение через truffle, он фиксирует его, и я вижу, как изменения отражаются в приложении Nodejs. Но я не могу выполнять какие-либо функции, вызываемые через сам nodejs. Он дает ожидаемый результат, но не фиксирует.

Проблема заключалась в том, что я добавил функциональность .call для вызова каждой функции смарт-контракта, когда она нужна только для постоянной функции, которая используется только для чтения значений. Спасибо за поддержку.