Ist es möglich, eine rohe, signierte Transaktion aus einem Ethereum-Vertrag zu senden?

Unterstützt die EVM dies? Lässt die Solidität das zu? Wie kann ich es tun?

Antworten (2)

Theoretisch ist es möglich, bei einer Transaktion zu einem Ethereum-Vertrag eine Signatur zu berechnen und eine signierte Transaktion zu erstellen. Dies ist jedoch selten nützlich, da zum Signieren einer Transaktion ein privater Schlüssel erforderlich ist und private Schlüssel normalerweise nicht nützlich sind, es sei denn, sie sind privat.

Wenn das Ziel darin besteht, eine Aktion für einen anderen Vertrag auszulösen, kann Ihr Code diesen Vertrag einfach aufrufen. Es ist nicht erforderlich, eine Transaktion zu unterzeichnen.

Wenn das Ziel darin besteht, eine Transaktion zu einem späteren Zeitpunkt an die Blockchain zu senden, kann dies erreicht werden, indem jemand anderes dazu angeregt wird, die Transaktion zu senden. Sehen Sie sich den Ethereum-Wecker für ein Beispiel an.

Ich möchte, dass ein Vertrag eine von einer Brieftasche signierte Transaktion an einen anderen Vertrag sendet. Die Transaktion wird signiert, bevor sie in die Blockchain aufgenommen wird, wodurch der private Schlüssel sicher aufbewahrt wird.
In diesem Fall ist die Antwort nein, ein Vertrag kann kein Netzwerk betreiben, also kann er nichts an das Netzwerk senden. Wenn Sie jedoch erklären können, welches Problem Sie lösen möchten, gibt es wahrscheinlich eine Lösung, bei der Sie dies nicht tun müssen.
Wie wäre es, wenn wir die Genehmigung als unterzeichnete Transaktion innerhalb des von uns getätigten Anrufs senden? Die Zeichenfreigabe ausführen und dann den getätigten Anruf ausführen?

Nicht ganz das, was Sie tun möchten, aber Multisig-Wallets ermöglichen das Senden beliebiger Transaktionen. Sie erstellen eine Rohtransaktion ohne Signierung und senden sie mit an das Multisig-Wallet submitTransaction(destination, txValue, txData).

Wenn die erforderliche Menge an Bestätigungen erreicht ist confirmTransaction, wird die Rohtransaktion mit so etwas ausgeführt

destination.call.value(txValue)(txData);

txData kann alles sein. For example if destination is a token contract, then txData can be a token transfer "0xa9059cbb00000000000000000000000012345678901234567890123456789012345678900000000000000000000000000000000000000000000000000de0b6b3a7640000".

  • 0xa9059cbb Überweisung (Ziel, Betrag)
  • 000000000000000000000001234567890123456789012345678901234567890 Zieladresse
  • 00000000000000000000000000000000000000000000000de0b6b3a7640000 zu überweisender Betrag