Vertrag aus Vertrag aus Vertrag anrufen?

So wie ich es verstehe, ist es möglich, dass ein Vertrag einen anderen Vertrag aufruft, indem er verwendet

othercontractaddress.call(gas_amount).value(eth amount)(tx data). 

Oder in diesem Fall Absender -> Vertrag A -> Vertrag B.

Kann man noch eine Ebene tiefer gehen?

Absender -> Vertrag A -> Vertrag B -> Vertrag C?

Etwas wie der folgende Pseudocode?:

   othercontractaddress.call(gas_amount).value(eth amount)(thatothercontract.call(gas_amount).value(eth amount)(2ndtxdata))

Antworten (1)

Ja, obwohl natürlich jeder Vertrag den Anruf selbst ausführen muss. Sie können dies 1024 Mal tun, bis Sie die maximale Tiefe erreicht haben. In dieser Tiefe werden alle neuen Aufrufe fehlschlagen. Dies führte in der Vergangenheit sogar zu Schwachstellen.

Allerdings hat EIP-150 die Gaskosten für Anrufe so stark erhöht, dass Sie die maximale Tiefe nicht mehr erreichen können.

Das macht Sinn. Würde so etwas wie der von mir gepostete Anrufcode tatsächlich funktionieren oder müsste er angepasst werden?
Nein, Sie müssten jeden Anruf im Vertrag definieren, der ihn ausführen soll. Zum Beispiel haben Sie in Vertrag A b_addr.call(gas_amount), dann in Vertrag B c_addr.call(gas_amount)und so weiter. Sie können die Aufrufe nicht wie in Ihrem Code in einem einzigen Vertrag "kondensieren".
1024 bezieht sich auf die maximale lokale Stack-Tiefe, von der jeder Aufruf mehr als 1 verwendet (bis zu 16 mit Solidity), sodass die maximale Anzahl verschachtelter Aufrufe wahrscheinlich viel geringer als 1024 ist
Interessant, kannst du das näher erläutern? Warum erzeugt ein einzelner Call in Solidity einen Call-Tiefe-Ersteller als 1?
Da es ihm egal ist, darauf zu antworten, hier meine eigene Meinung dazu: Es ist falsch. Ein Call in Solid erhöht die Call-Tiefe genau um eins. Nichts, was ich gesehen habe, weist auf etwas anderes hin, und es würde sowieso keinen Sinn ergeben. Zumindest auf EVM-Ebene ist dies definitiv wahr: github.com/ethereum/pyethereum/blob/develop/ethereum/vm.py#L712 : msg.depth + 1für eine CALLAnleitung.
Kannst du bitte eine ausführliche Antwort schreiben? @mafrasi2
@ferit Welche weiteren Details gibt es? Ich denke, ich habe alles erwähnt, was es dazu zu sagen gibt, ohne den eigentlichen Code in den EVM-Implementierungen zu veröffentlichen (na ja, ich habe auf eine verlinkt). Die EVM spezifiziert keine Funktionen, wie der andere Benutzer vorschlägt, daher hat der Callstack „Intra Contract“ von Solidity nichts mit dem Callstack „Inter Contract“ der EVM zu tun.