Wie gibt man private Schlüssel an, wenn man node.js und Ethereum verwendet, um einen Vertrag auszuführen?

Ich muss node.js ausführen, um Smart Contracts auszuführen. Meine Frage bezieht sich auf die Schlüssel.

Ich habe das aus den Dokumenten gesehen -

1. Code zum Signieren
2. Auszuführender Code

Aber ich bin mir nicht sicher, wie die beiden kombiniert werden. Könnte das jemand klären?

Ich habe einen bereitgestellten Vertrag mit dieser Funktion -

function addBonus( string bonusType, uint bonusTarget, uint bonusEndYear,
        uint bonusEndMonth, uint bonusEndDay,
        string bonusToken, uint bonusAmount, string bonusName, uint ineq ) public {
// wird bearbeitet
}

Aus den Dokumenten -

var Tx = require('ethereumjs-tx');
var privateKey = new Buffer('e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109', 'hex')
var rawTx = {  
einmal: '0x00',  
gasPrice: '0x09184e72a000',   
gasLimit: '0x2710',  
zu: '0x00000000000000000000000000000000000000',
Wert: '0x00',   
Daten: '0x7f7465737432000000000000000000000000000000000000000000000000000600057' }
var tx = neues Tx (rawTx);
tx.sign (privater Schlüssel);
var serializedTx = tx.serialize();  
web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {  
wenn (! err)    
console.log (Hash); // "0x7f9fade1c0d57a7af66ab4ead79fade1c0d57a7af66ab4ead7c2c2eb7b11a91385" });

Und das -

// Vertrag abi
var abi = [{
    name: 'myConstantMethod',
    Typ: 'Funktion',
    konstant: wahr,
    Eingaben: [{Name: 'a', Typ: 'String' }],
    Ausgaben: [{Name: 'd', Typ: 'Zeichenfolge' }]
}, {
    name: 'myStateChangingMethod',
    Typ: 'Funktion',
    konstant: falsch,
    Eingaben: [{ Name: 'a', Typ: 'String' }, { Name: 'b', Typ: 'int' }],
    Ausgänge: []
}, {
    name: 'myEvent',
    Typ: 'Ereignis',
    Eingaben: [{Name: 'a', Typ: 'int', indexiert: true},{Name: 'b', Typ: 'bool', indexiert: false}]
}];
// Erstellung des Vertragsgegenstandes
var MyContract = web3.eth.contract(abi);
// Vertrag für eine Adresse initiieren
var myContractInstance = MyContract.at('0xc4abd0339eb8d57087278718986382264244252f');
// konstante Funktion aufrufen
var result = myContractInstance.myConstantMethod('myParam');
console.log(Ergebnis) // '0x25434534534'
// Sende eine Transaktion an eine Funktion
myContractInstance.myStateChangingMethod('someParam1', 23, {value: 200, gas: 2000});
// kurzer Handstil
web3.eth.contract(abi).at(Adresse).myAwesomeMethod(...);
// Filter erstellen
var filter = myContractInstance.myEvent({a: 5}, function (error, result) {
 wenn (! Fehler)
   console.log (Ergebnis);
   /*
   {
       Adresse: '0x8718986382264244252fc4abd0339eb8d5708727',
       Themen: "0x12345678901234567890123456789012", "0x00000000000000000000000000000000000000000000000000000000000005",
       Daten: "0x0000000000000000000000000000000000000000000000000000000000001",
       ...
   }
   */
});

Ich nehme an, wir müssen diese beiden geäußerten Ideen irgendwie kombinieren. Ich kann im zweiten Beispiel keine privaten Schlüssel sehen und das erste enthält kein Beispiel für die Ausführung eines Vertrags.

Ihre Frage ist etwas verwirrend, ich bin mir nicht sicher, was Sie genau fragen. Das von Ihnen gepostete Snippet, das einen privaten Schlüssel beinhaltete, führte eine Transaktion zum Erstellen eines Vertrags durch, während das zweite Snippet eine Transaktion zum Aufrufen einer Funktion für den Vertrag durchführte. Ihr zweites Snippet verwendete auch web3, das über eine integrierte Kontoverwaltung verfügt. Wenn Sie aufgerufen haben , müssten Sie normalerweise eine Adresse in das letzte Objekt .myStateChangingMethodeinfügen . fromweb3 folgerte, dass Sie wahrscheinlich die erste Adresse im Schlüsselspeicher verwenden wollten, und holte automatisch ihren privaten Schlüssel zum Signieren der Transaktion.
Ich bin mir nicht sicher, wie ich web3 ohne Metamaske verwenden soll. Sie geben an, dass es eine eigene Genehmigung hat, aber das ist beispielsweise bei der Verwendung von Metamask der Fall. Um web3 zu verwenden, müssen wir txns irgendwie signieren oder die privaten Schlüssel bereitstellen. Das ist, was ich frage.
Sehen Sie sich die web3-Dokumentation für web.eth.accounts. Alles, was Metamask tut, ist eine Wallet-Datei mit Ihrem Google-Konto (IIRC) zu verknüpfen. Wenn Sie bereits eine Brieftasche mit Ihrer Adresse und Ihren Schlüsseln haben, können Sie die Brieftasche laden und diese Schlüssel werden darin gespeichert. Sie können auch anrufen wallet.createund es wird eine neue Brieftasche im Speicher erstellt, die Sie dann speichern können. Web3 kümmert sich um das Erhalten der Schlüssel und das Signieren, Sie müssen ihm nur sagen, wo sich die Schlüssel befinden – MetaMask hat das in der Vergangenheit für Sie erledigt.
Ich habe es jetzt gelöst. Ich werde später posten. Es ist viel komplexer als das Auschecken von web3-Dokumenten.
Ich wünschte, ich hätte Ihr Problem besser verstehen und Ihnen mehr helfen können, aber ich freue mich zu hören, dass Sie es gelöst haben!
Das Problem ist die Autorisierung der txns. Den Code poste ich später.

Antworten (3)

   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;
        });
  })

Sie können es entweder zu Ihrer .env-Datei hinzufügen, wenn Sie nur ein Konto verwenden, um Geld zu überweisen, oder Sie können es in verschlüsselter Form in einer Datenbank speichern https://www.npmjs.com/package/bcrypt .

Es gibt eine bessere und einfachere Möglichkeit, die Smart-Contract-Funktion zu unterzeichnen und auszuführen. Hier ist Ihre Funktion addBonus.

Zuerst erstellen wir die Smart-Contract-Instanz:

 const createInstance = () => {
  const bscProvider = new Web3(
    new Web3.providers.HttpProvider(config.get('bscRpcURL')),
  );
  const web3BSC = new Web3(bscProvider);
  const transactionContractInstance = new web3BSC.eth.Contract(
    transactionSmartContractABI,
    transactionSmartContractAddress,
  );
  return { web3BSC, transactionContractInstance };
};

Jetzt erstellen wir eine neue Funktion zum Signieren und Ausführen der addBonus-Funktion

   const updateSmartContract = async (//parameters you need) => {
     try {
    const contractInstance = createInstance();
// need to calculate gas fees for the addBonus
    const gasFees =
      await contractInstance.transactionContractInstance.methods
        .addBonus(
         // all the parameters
        )
        .estimateGas({ from: publicAddress_of_your_desired_wallet });
   const tx = {
      // this is the address responsible for this transaction
      from: chainpalsPlatformAddress,
      // target address, this could be a smart contract address
      to: transactionSmartContractAddress,
      // gas fees for the transaction
      gas: gasFees,
      // this encodes the ABI of the method and the arguments
      data: await contractInstance.transactionContractInstance.methods
        .addBonus(
       // all the parameters
        )
        .encodeABI(),
    };
  // sign the transaction with a private key. It'll return messageHash, v, r, s, rawTransaction, transactionHash
    const signPromise =
       await contractInstance.web3BSC.eth.accounts.signTransaction(
        tx,
        config.get('WALLET_PRIVATE_KEY'),
      );
    // the rawTransaction here is already serialized so you don't need to serialize it again
    // Send the signed txn
    const sendTxn =
      await contractInstance.web3BSC.eth.sendSignedTransaction(
        signPromise.rawTransaction,
      );
    return Promise.resolve(sendTxn);
} catch(error) {
  throw error;
}
    }

Viel Spaß beim Codieren :)