Solidity-Tutorial für Anfänger: 14. Abstrakte Verträge und Schnittstellen

Solidity-Tutorial für Anfänger: 14. Abstrakte Verträge und Schnittstellen

In dieser Vorlesung verwenden wir den ERC721- Schnittstellenvertrag als Beispiel, um den abstrakten Vertrag ( Abstract ) und die Schnittstelle ( Schnittstelle ) in solider Form vorzustellen , damit jeder den ERC721 -Standard besser verstehen kann.

abstrakter Vertrag

Wenn in einem Smart Contract mindestens eine nicht implementierte Funktion vorhanden ist, das heißt, einer Funktion fehlt der Inhalt im Hauptteil**{}, muss der Vertrag als abstrakt** markiert werden, andernfalls meldet die Kompilierung einen Fehler; außerdem Die nicht implementierte Funktion muss virtuell hinzugefügt werden , um das Umschreiben von Unterverträgen zu erleichtern. Nehmen Sie als Beispiel unseren vorherigen Einfügungssortierungsvertrag . Wenn wir nicht herausgefunden haben, wie die Einfügungssortierungsfunktion implementiert wird, können wir den Vertrag als abstrakt markieren und ihn später von anderen schreiben lassen.

abstract contract InsertionSort{
    function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);
}

Schnittstelle

Eine Schnittstelle ähnelt einem abstrakten Vertrag, implementiert jedoch keine Funktionalität. Schnittstellenregeln:

  1. Kann keine Statusvariablen enthalten
  2. Darf keine Konstruktoren enthalten
  3. Andere Verträge außer Schnittstellen können nicht geerbt werden
  4. Alle Funktionen müssen extern sein und dürfen keinen Funktionskörper haben
  5. Verträge, die eine Schnittstelle erben, müssen alle von der Schnittstelle definierten Funktionen implementieren

Obwohl die Schnittstelle keine Funktionalität implementiert, ist sie sehr wichtig. Eine Schnittstelle ist das Rückgrat eines Smart Contracts und definiert die Funktionalität des Vertrags und wie diese ausgelöst werden: Wenn ein Smart Contract eine bestimmte Schnittstelle (wie ERC20 oder ERC721 ) implementiert, wissen andere Dapps und Smart Contracts, wie sie damit interagieren. Denn die Schnittstelle liefert zwei wichtige Informationen:

  1. Der Bytes4- Selektor jeder Funktion im Vertrag und der Funktionssignatur -Funktionsname (jeder Parametertyp) .
  2. Schnittstellen-ID (weitere Informationen finden Sie unter EIP165 )

Darüber hinaus entspricht die Schnittstelle dem Vertrags- ABI (Application Binary Interface) und kann ineinander konvertiert werden: Sie können das ABI des Vertrags durch Kompilieren der Schnittstelle erhalten und auch das Tool abi-to-sol verwenden Konvertieren Sie die ABI-JSON -Datei in eine Schnittstellen-Sol -Datei.
Nehmen wir als Beispiel den ERC721- Schnittstellenvertrag IERC721 . Er definiert 3 Ereignisse und 9 Funktionen . Alle ERC721- Standard-NFTs implementieren diese Funktionen. Wir können sehen, dass der Unterschied zwischen Schnittstellen und regulären Verträgen darin besteht, dass jede Funktion mit **; endet, statt mit dem Funktionskörper { }**.

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    function transferFrom(address from, address to, uint256 tokenId) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data) external;
}

IERC721-Ereignis

IERC721 enthält 3 Ereignisse, von denen Transfer- und Genehmigungsereignisse auch in ERC20 enthalten sind .

  • Übertragungsereignis : Wird während der Übertragung freigegeben und zeichnet die Ausgabeadresse des Tokens von , die Empfangsadresse an und die Token-ID auf .
  • Genehmigungsereignis : Wird während der Autorisierung freigegeben und zeichnet den Eigentümer der autorisierten Adresse , die genehmigte autorisierte Adresse und die Token-ID auf .
  • ApprovalForAll- Ereignis: wird während der Batch-Autorisierung freigegeben, wobei der ausstellende Adresseigentümer der Batch-Autorisierung , der autorisierte Adressbetreiber und die Genehmigung , unabhängig davon, ob sie autorisiert ist oder nicht, aufgezeichnet werden .

IERC721-Funktion

  • balanceOf : Gibt den Saldo der NFT-Bestände einer bestimmten Adresse zurück .
  • ownerOf : Gibt den Besitzer einer bestimmten tokenId zurück .
  • transferFrom : Normale Übertragung, die Parameter sind die Übertragungsadresse von , die Empfangsadresse an und tokenId .
  • safeTransferFrom : sichere Übertragung (wenn der Empfänger eine Vertragsadresse ist, muss die ERC721Receiver- Schnittstelle implementiert werden). Die Parameter sind die Übertragungsadresse von , die Empfangsadresse an und tokenId .
  • genehmigen : Autorisieren Sie eine andere Adresse zur Nutzung Ihres NFT. Die Parameter sind autorisierte Adressengenehmigung und tokenId .
  • getApproved : Fragen Sie die Adresse ab, für die die tokenId genehmigt wurde.
  • setApprovalForAll : Autorisieren Sie die Reihe von NFTs, die Sie stapelweise halten, einem Adressoperator .
  • isApprovedForAll : Überprüfen Sie, ob die NFT einer bestimmten Adresse stapelweise an eine andere Betreiberadresse autorisiert wurde .
  • safeTransferFrom : Überladene Funktion für sichere Übertragung, die Parameter umfassen Daten .

Wann werden Schnittstellen verwendet?

Wenn wir wissen, dass ein Vertrag die IERC721- Schnittstelle implementiert, können wir mit ihm interagieren, ohne seine spezifische Code-Implementierung zu kennen.
Boring Monkey BAYC ist ein ERC721- Token und implementiert die Funktionen der IERC721- Schnittstelle. Wir müssen seinen Quellcode nicht kennen, wir müssen nur seine Vertragsadresse kennen und können über die IERC721- Schnittstelle mit ihm interagieren . Verwenden Sie beispielsweise balanceOf() , um den BAYC- Kontostand einer bestimmten Adresse abzufragen , und verwenden Sie ihn safeTransferFrom() zum Übertragen von BAYC .

contract interactBAYC {
    // 利用BAYC地址创建接口合约变量(ETH主网)
    IERC721 BAYC = IERC721(0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D);

    // 通过接口调用BAYC的balanceOf()查询持仓量
    function balanceOfBAYC(address owner) external view returns (uint256 balance){
        return BAYC.balanceOf(owner);
    }

    // 通过接口调用BAYC的safeTransferFrom()安全转账
    function safeTransferFromBAYC(address from, address to, uint256 tokenId) external{
        BAYC.safeTransferFrom(from, to, tokenId);
    }
}

Bei Remix überprüfen

  • Abstraktes Vertragsbeispiel (einfacher Demonstrationscode ist in der Abbildung dargestellt)Bild.png
  • Schnittstellenbeispiel (einfacher Demonstrationscode ist in der Abbildung dargestellt)Die Übertragung des externen Linkbilds ist fehlgeschlagen. Die Quellseite verfügt möglicherweise über einen Anti-Leeching-Mechanismus. Es wird empfohlen, das Bild zu speichern und direkt hochzuladen.

Zusammenfassen

In dieser Vorlesung habe ich den abstrakten Vertrag ( abstract ) und die Schnittstelle ( interface ) in Solidität vorgestellt , die beide Vorlagen schreiben und Code-Redundanz reduzieren können. Wir haben auch über den ERC721- Schnittstellenvertrag IERC721 und dessen Verwendung für die Interaktion mit dem BAYC- Vertrag gesprochen.

Supongo que te gusta

Origin blog.csdn.net/weixin_52148451/article/details/132781478
Recomendado
Clasificación