【Smart Contract】 Vertragsübertragung

Verträge können reich sein

Verträge können reich sein!
Übertragung zwischen Verträgen und anderen Verträgen oder EOA

Benzin und Gaspreis

https://github.com/wolflo/evm-opcodes/blob/main/gas.md
Das eigentliche Gas wird vollständig durch die Ausführungslogik bestimmt, eine Vertragsfunktion mit fester Logik wird ausgeführt, das Gas ändert sich nicht, das Gas Änderungen Der Preis wird durch die Transaktion festgelegt Der Transaktionsauslöser legt den maximalen Verbrauch fest: Gaslimit, das verbleibende nicht verbrauchte Gas wird "erstattet". Wenn die Transaktion fehlschlägt, wird das verbrauchte Gas nicht erstattet, und die Funktion ruft zwischen den Verträgen Gaslimit
auf einstellbar: Anrufer zur Kontrolle des Gasverbrauchs

Übergabe und Funktionsaufruf

  • Es gibt keine separate Übertragungslogik, die Übertragung erfolgt zusammen mit dem Funktionsaufruf.
  • Die Übertragung ist ein Funktionsaufruf, fügen Sie die Aufrufoption {gas[gaslimit]:,value:}ccontracta.foo{option}();
  • Der Angerufene fügt den Zahlungsmodifikator hinzu

Ein paar Anmerkungen

  • Rufen Sie die Übertragung fname{gas:, value:}() über die statische Funktion auf, ändern Sie die aufgerufene normale Funktion mit pay und übertragen Sie die Übertragung über den dynamischen Funktionsaufruf aadress.call{gas:, value:}(calldata) zum Empfang die Übertragung.
  • Die aufgerufene Funktion wird mit payble modifiziert: Bringt der Aufruf kein Geld, muss der Angerufene nicht payble sein;
  • Wenn das Geld gebracht wird, der Angerufene aber nicht zahlbar ist, wird es scheitern
  • Funktionsaufrufe können von Übertragungsoperationen begleitet werden

Beispielcode

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract ReceiveEther {
    
    
 uint public x;
 event Fallback(bytes cdata, uint value, uint gas);
 event Foo(bytes cdata, uint value, uint gas);
 
 // Fallback function is called when msg.data is not empty
 fallback() external {
    
    
 emit Fallback(msg.data, 0, gasleft());
 }
 function getBalance() public view returns (uint) {
    
    
 return address(this).balance;
 }
 function foo() public payable {
    
    
 emit Foo(msg.data, msg.value, gasleft());
 }
}
contract SendEther {
    
    
 function sendViaCall(address payable _to) public payable {
    
    
 (bool sent, ) = _to.call{
    
    value: msg.value}("");
 require(sent, "Failed to send Ether");
 }
 function sendViaFoo(address payable _to) public payable {
    
    
 ReceiveEther re = ReceiveEther(_to);
 re.foo{
    
    gas:2300, value: msg.value}();
 //msg.value是sendViaFoo的调用者发送给SendEther
 
 }
}

Guess you like

Origin blog.csdn.net/weixin_42918559/article/details/127825390