Wie sende ich eine Transaktions-/Aufruffunktion von der Serverseite?

Nachdem ein Ereignis von meinem Smart Contract ausgesendet wurde und ich es serverseitig höre, möchte ich eine bestimmte Funktion im Smart Contract aufrufen und ihr einige Informationen zur Verwendung übergeben.

Ich frage mich, wie Sie eine Transaktion serverseitig platzieren. In dieser Frage scheint es einfach zu sein: Eine Transaktion serverseitig signieren

aber woher weiß die Serverseite, welches Konto/privater Schlüssel verwendet werden soll. Browserseitig erscheint eine Metamaske und der Benutzer signiert sie physisch. Wie macht das serverseitig das? Es gibt niemanden, der es physisch unterschreibt, und nirgendwo, wo es auftaucht?

Danke für jede Hilfe!

Antworten (3)

Um eine Transaktion für ein bestimmtes Konto zu signieren, benötigen Sie lediglich Zugriff auf den privaten Schlüssel für dieses Konto.

Plugins wie MetaMask verwalten einfach den Zugriff auf Ihre privaten Schlüssel und lassen den Benutzer entscheiden, wann und wie er seinen privaten Schlüssel zum Signieren von Transaktionen oder Nachrichten verwendet.

Für eine serverseitige Anwendung müssten Sie einen privaten Schlüssel speichern, den der Dienst verwenden kann, und über Ihren Code steuern, wann und wo dieser Dienst Transaktionen signiert.

Schauen Sie sich die Funktionen unter web3.eth.accountswie an:

Es ist wahrscheinlich sinnvoll, dass Sie ein bestimmtes Ethereum-Konto für Ihren Dienst erstellen und diesem Dienst besonderen Zugriff auf Ihren Vertrag gewähren, wenn Sie erwarten, dass zwischen diesen beiden Anwendungen ein hohes Vertrauen besteht. Dies ist privilegierten Service-to-Service-Aufrufen in der modernen Anwendungsentwicklung sehr ähnlich.

Ah okay. Also würde ich den privaten Schlüssel in eine Variable einfügen und damit das bestimmte Ethereum-Konto, das ich besitze, „entsperren“. Cool danke für die Klarstellung. Eine Frage: Wie würde ich einen speziellen Zugang zu meinem Vertrag für ein bestimmtes Konto aktivieren? Meinen Sie so etwas wie require('thatAccountAddress' == msg.sender), damit nur dieses Konto die Funktion aufrufen kann? Oder ist ihr anderes Muster, das verwendet werden kann? Danke!
Sie möchten einige RBAC in Ihrem Vertrag ähnlich wie Open-Zeppelins Ownable.sol durchführen , im Grunde wo Sie eine bestimmte Adresse definieren, um Zugriff auf Funktionen zu haben, auf die andere Konten keinen Zugriff hätten. Dies ist in Ihrem Szenario möglicherweise nicht erforderlich, aber normalerweise möchten Sie dies in Systemen, in denen Sie über ein Backend und einen intelligenten Vertrag verfügen, die Sie besitzen, interagieren, anders behandeln. Ich empfehle auch, dass Sie ein neues Konto für Ihr Backend erstellen, anstatt Ihr persönliches Konto zu verwenden.

Ich habe den folgenden Code aus meinem Node-js-Skript extrahiert, in dem ich versuche, eine Verbindung mit Smart Contract herzustellen und nach Ereignissen Ausschau zu halten. Es kann Ihnen helfen, sich eine Vorstellung zu machen.

var express = require('express'); var app = ausdrücken (); const Web3 = require('web3'); const web3 = new Web3(new Web3.providers.HttpProvider(" http://localhost:7545 "));

web3.eth.defaultAccount = web3.eth.accounts[1];

var StudentContract = web3.eth.contract([YOUR_ABI]);

var Student = Studentenvertrag.at('IHR_VERTRAG_ADD');

app.post('/upload', function(req, res) {

    Student.createStudents(studentName,studentAccYear, hashCode, {gas: '195253'});

    var studentEvent = Student.studentInfo();
    studentEvent.watch(function(error, result){
    if (!error)
        {
            console.log(result);
            } else {
            console.log(error);
        } 
        return;
   });

});

app.listen('3000', function(){ console.log('running on 3000...'); });

Ich verstehe überhaupt nicht, wie das hilft. Sie legen nur ein Standardkonto fest, das auf voreingestellten (injizierten) Konten basiert.

Auf der Clientseite speichern Wallets wie Metamask Ihre Kontodaten (einschließlich privater Schlüssel), sodass Sie bei Smart-Contract-Transaktionen mit einem Popup-Fenster zum Signieren einer Transaktion eingeschüchtert werden (Metamask, die nach der Verwendung des privaten Schlüssels fragt).

Auf der Serverseite ist es etwas ähnlich, das einzige, was Sie speichern müssen, ist der private Schlüssel des Kontos, mit dem Sie Transaktionen durchführen oder einen Smart Contract ausführen müssen. Und nach Ihrer API-Ausführung können Sie sehen, wie Ihre Gelder anstelle von Gasgebühren, falls vorhanden, automatisch von Ihrer Metamask-Brieftasche abgezogen werden.

Verwenden Sie die ethers.js- Bibliothek für die intelligente Vertragsausführung.

Beispielverwendung auf Serverseite: -

  const provider = new ethers.providers.JsonRpcProvider(
    'http://localhost:8545'
  );
  const signer = new ethers.Wallet('privateKeyString', provider);
  const contract = new ethers.Contract('contractAddress', abi, signer);
  await contract.someContractFunction();