Die Verwendung von web3 v1 Beta von Nodejs zum Aufrufen von myMethod.send() ergibt die Verwendung von Trusted Signer. Wie mache ich das?

Verwenden von web3Version 1 Beta 27, verbunden mit einem Remote-Paritätsknoten, der mit dem Ropsten-Netzwerk verbunden ist.

Ich habe ein Konto mit öffentlichen und privaten Schlüsseln erstellt, ich habe einige Test-Eth an diese Adresse gesendet. Das funktioniert alles prima.

Beim Versuch, tatsächlich eine Funktion für meinen Vertrag aufzurufen, erhalte ich die Nachricht

Your account is locked. Unlock the account via CLI, personal_unlockAccount or use Trusted Signer

Ich habe keinen Zugriff auf den Knoten über CLI, also muss ich use Trusted Signer.

Wenn ich mir die Dokumente ansehe, web3.eth.accounts.signsehe ich Folgendes

Zeichen

web3.eth.accounts.sign(data, privateKey);

Signiert beliebige Daten. Diese Daten werden vor UTF-8 HEX dekodiert und wie folgt umhüllt: "\x19Ethereum Signed Message:\n" + message.length + message.

Parameter

  1. data - String: Die zu signierenden Daten. Wenn es eine Zeichenfolge ist, wird es sein
  2. privateKey - String: Der private Schlüssel zum Signieren.

was ehrlich gesagt keinen Sinn macht.

Angenommen, die Funktion, die ich aufrufe, ist

TestContract.methods.test(testAddress).send()

Wie genau verwende ich web3.eth.accounts.signin diesem Zusammenhang?

Antworten (1)

Ich habe das jetzt ausgearbeitet. Zuerst muss ich sicherstellen, dass ich Zugriff auf den privaten Schlüssel für die Adresse sowie auf die Adresse des Absenders habe.

Mit diesen Informationen kann ich Folgendes tun.

const testFn = TestContract.methods.test(testAddress)
const gas = await testFn.estimateGas()
const account = web3.eth.accounts.privateKeyToAccount(PRIVATE_KEY)
const data = testFn.encodeABI()
const nonce = await web3.eth.getTransactionCount(SENDER_ADDRESS, 'pending')
const payload = {
  nonce,
  data,
  gas,
  from: SENDER_ADDRESS,
  to: testContractAddress
}
const signedTx = await account.signTransaction(payload, account.privateKey)
const { rawTransaction } = signedTx
const response = await web3.eth.sendSignedTransaction(rawTransaction)

Das funktioniert gut.

Offensichtlich ist dies nur für Code geeignet, der in NodeJS ausgeführt wird, da Sie niemals möchten, dass der private Schlüssel in einer öffentlichen Webschnittstelle offengelegt wird.