Solidity
使用 node.js 和 ethereum 執行合約時如何聲明私鑰?
我必須執行 node.js 來執行智能合約。我的問題是關於鑰匙的。
我從文件中看到了這一點-
1. 簽名程式碼 2. 執行程式碼
但我不確定這兩者是如何結合的。有人可以澄清一下嗎?
我有一個具有此功能的已部署契約-
函式addBonus(字元串bonusType,uint bonusTarget,uint bonusEndYear, uint bonusEndMonth, uint bonusEndDay, string bonusToken, uint bonusAmount, 字元串 bonusName, uint ineq) public { // 加工 }
從文件 -
var Tx = require('ethereumjs-tx'); var privateKey = new Buffer('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex') var rawTx = { 隨機數:'0x00', gasPrice: '0x09184e72a000', gasLimit: '0x2710', 至:'0x000000000000000000000000000000000000000000', 值:'0x00', 數據:'0x7f7465737432000000000000000000000000000000000000000000000000000000600057'} var tx = 新的 Tx (rawTx); tx.sign(privateKey); var serializedTx = tx.serialize(); web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) { 如果(!錯誤) 控制台.log(雜湊);// "0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385" });
還有這個 -
// 合約 abi 變種兄弟= [{ 名稱:'myConstantMethod', 類型:'功能', 常數:真, 輸入:[{名稱:'a',類型:'string'}], 輸出:[{name:'d',類型:'string'}] }, { 名稱:'myStateChangingMethod', 類型:'功能', 常數:假, 輸入:[{名稱:'a',類型:'string'},{名稱:'b',類型:'int'}], 輸出:[] }, { 名稱:'我的事件', 類型:'事件', 輸入:[{名稱:'a',類型:'int',索引:true},{名稱:'b',類型:'bool',索引:false}] }]; // 創建合約對象 var MyContract = web3.eth.contract(abi); // 為一個地址啟動合約 var myContractInstance = MyContract.at ('0xc4abd0339eb8d57087278718986382264244252f'); // 呼叫常量函式 var 結果 = myContractInstance.myConstantMethod('myParam'); console.log(result) // '0x25434534534' // 向函式發送事務 myContractInstance.myStateChangingMethod('someParam1', 23, {value: 200, gas: 2000}); // 簡寫風格 web3.eth.contract(abi).at(address).myAwesomeMethod(...); // 創建過濾器 var filter = myContractInstance.myEvent({a: 5}, function (error, result) { 如果(!錯誤) 控制台.log(結果); /* { 地址:'0x8718986382264244252fc4abd0339eb8d5708727', 主題:“0x12345678901234567890123456789012”,“0x00000000000000000000000000000000000000000000000000000000000000005”, 數據:“0x00000000000000000000000000000000000000000000000000000000000000000001”, ... } */ });
我認為我們必須以某種方式將這兩種表達的想法結合起來。在第二個範例中我看不到任何私鑰,第一個範例沒有執行合約的範例。
var infuraApiKey =process.env.INFURA_API_KEY; // var privateKey = process.env.PRIVATE_KEY; var web3js = new web3(new web3.providers.HttpProvider("https://kovan.infura.io/v3/"+infuraApiKey)); web3js.eth.defaultAccount = myAddress; var privateKey=new Buffer(process.env.PRIVATE_KEY, 'hex'); // var toAddress = 'ADRESS_TO_SEND_TRANSACTION'; //contract abi is the array that you can get from the ethereum wallet or etherscan var contractABI =bonusABI; var contractAddress =bonusAddress; //creating contract object var contract = web3js.eth.contract(contractABI).at(contractAddress); var count; var nounce; var errcode=""; web3js.eth.getTransactionCount(myAddress, function(err, result) { nounce=result; var nounceHex = web3js.toHex(nounce); var rawTransaction = {"from":myAddress, "gasPrice":web3js.toHex(2*1e9), "gasLimit":web3js.toHex(920000), "to":contractAddress, "data":contract.addBonus.getData(bonusType, target, year, month, day, token, bonus, bonusName, ineq), "nonce":nounceHex} var transaction = new Tx(rawTransaction); transaction.sign(privateKey); var serializedTx = transaction.serialize(); web3js.eth.sendRawTransaction('0x'+serializedTx.toString('hex'), function(err1, hash) { if (!err1) { errcode=hash; } else errcode=err1; }); })
如果您只使用一個帳戶從中轉移資金,您可以將其添加到您的 .env 文件中,或者您可以將其加密形式儲存在數據庫中https://www.npmjs.com/package/bcrypt。