Solidity

使用 node.js 和 ethereum 執行合約時如何聲明私鑰?

  • March 16, 2022

我必須執行 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

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