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.
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 :)
achso
.myStateChangingMethod
einfügen .from
web3 folgerte, dass Sie wahrscheinlich die erste Adresse im Schlüsselspeicher verwenden wollten, und holte automatisch ihren privaten Schlüssel zum Signieren der Transaktion.Trevor Lee Oakley
achso
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 anrufenwallet.create
und 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.Trevor Lee Oakley
achso
Trevor Lee Oakley