Solidity
使用 node.js 執行松露程式碼的問題
我正在嘗試在後端使用 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。這就是我正在使用的,它列印得很好。
希望能幫助到你。