Solidity

使用 node.js 執行松露程式碼的問題

  • January 27, 2020

我正在嘗試在後端使用 Node.JS 執行松露程式碼來部署契約。我希望能夠以互動方式執行此操作,並且打算使用 Express 庫與 Node 後端進行互動。

但是,在第一個實例中,我只是嘗試在節點中執行 .js 來部署契約。我可以在部署腳本中輕鬆做到這一點,但希望能夠在執行中做到這一點。這是我正在談論的程式碼:

const Web3 = require("web3");
const HDWalletProvider = require("truffle-hdwallet-provider");
const mnemonic = "..."

var httpProvider = new Web3.providers.HttpProvider('https://ropsten.infura.io/v3/<my API>');
var provider = new HDWalletProvider(mnemonic, httpProvider);

var contract        = require("truffle-contract");
var myContractJSON  = require('./build/contracts/Insurer.json');

// Read JSON and attach RPC connection (Provider)
var myContract = contract(myContractJSON);
myContract.setProvider(provider);

myContract.new("0x20202020202020202020204931303031", "0x20202020202020202020436f66616365")
   .then(function(instance) {
   return instance.getInsurerInfo.call()
   }).then(function(result) {
       console.log(result[0], result[1]);
       res.send('Insurer contract made successfully: '+result[0]+' '+result[1]);
       }, function(error) {
   console.log(error);
   });

這是相關的契約程式碼:

   contract Insurer {
   bytes16 public insurerUIC;  
   bytes16 public insurerName;

   constructor(bytes16 _insurerUIC, bytes16 _insurerName) public {
       insurerUIC      = _insurerUIC;
       insurerName     = _insurerName;
       } // constructor(bytes16 _insurerUIC, bytes16 _insurerName) public {

   function () payable external {
       // fallback function to receive funds
   } // function () payable external {

   function getInsurerInfo() view public returns (bytes16, bytes16) {
       return (insurerUIC, insurerName);
       } // function getInsurerInfo() view public returns (bytes16, bytes16)

   } // contract Insurer {

合約有 2 個參數。當我執行上面的程式碼時,它似乎在執行,但實際上什麼也沒發生。

知道有什麼問題嗎?另外,如何在無法使用控制台的情況下調試 Node 程式碼?

對不起初學者的問題,但我很掙扎!

謝謝,

菲爾

您的程式碼有兩個問題。第一個是阻止部署合約:每當您將交易發送到區塊鏈(而不是呼叫)時,您都必須傳遞“發件人”地址。因此,實例化應如下所示:

myContract.new("0x20...31", "0x20...65", { from: provider.getAddress() })

另一個問題是您沒有聽到您將得到的第一個響應,即 txHash。該響應將比契約的實例早得多。因此,即使您添加了“發件人”地址,它仍然看起來像沒有發生任何事情,因為您正在等待部署被探勘。

為了讓您獲得第一個響應,您應該添加以下內容:

.once('transactionHash', function(hash) {
   console.log("TxHash: " + hash);
})

這應該會很快發生,然後您可以再等待 30 秒左右以獲得您期望的結果。

最終程式碼是:

const Web3 = require('web3');
const HDWalletProvider = require("@truffle/hdwallet-provider");

require('dotenv').config();
const provider = new HDWalletProvider(process.env.PRIVATE_KEY, process.env.INFURA_URL);

const contract = require('@truffle/contract');
const artifacts = require('./../contracts/Insurer.json');

var myContract = contract(artifacts);
myContract.setProvider(provider);

myContract.new("0x20202020202020202020204931303031", "0x20202020202020202020436f66616365", { from:provider.getAddress() })
       .once('transactionHash', function(hash) {
           console.log("TxHash: " + hash);
       }).then(function(instance) {
           return instance.getInsurerInfo.call()
       }).then(function(result) {
           console.log(result[0], result[1]);
       }, function(error) {
           console.log(error);
       });

請注意,我使用私鑰而不是助記符來設置 HDWallet 提供程序,但這應該沒有區別。另外,我正在使用@truffle/hdwallet-provider 和@truffle/contract 的更新版本,但我認為這也無關緊要。

另外,如何在無法使用控制台的情況下調試 Node 程式碼?

試試nodemon。這就是我正在使用的,它列印得很好。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/79339