Wie schreibe ich einen intelligenten Vertrag mit Python über Ontologie? Teil 1: Die Blockchain & Block API

Bild

Dies ist ein offizielles Tutorial, das zuvor im Ontology Medium-Blog veröffentlicht wurde
Aufgeregt, es für Habr-Leser zu veröffentlichen. Sie können gerne verwandte Fragen stellen und ein besseres Format für Lernmaterialien vorschlagen

Vorwort


In diesem Artikel werden wir mit der Einführung der Smart Contract API von Ontology beginnen. Die Smart Contract API der Ontology ist in 7 Module unterteilt:


In diesem Artikel stellen wir die Blockchain & Block-API vor , die den grundlegendsten Teil des Smart Contract-Systems von Ontology darstellt. Die Blockchain-API unterstützt grundlegende Blockchain-Abfrageoperationen, z. B. das Abrufen der aktuellen Blockhöhe, während die Block-API grundlegende Blockabfrageoperationen unterstützt, z. B. das Abfragen der Anzahl von Transaktionen für einen bestimmten Block.

Fangen wir an!

Erstellen Sie zunächst einen neuen Vertrag in SmartX und befolgen Sie dann die nachstehenden Anweisungen.

1. Verwendung der Blockchain-API


Verweise auf intelligente Vertragsfunktionen sind identisch mit den Referenzen von Python. Entwickler können bei Bedarf die entsprechenden Funktionen einführen. In der folgenden Anweisung werden beispielsweise GetHeight , die Funktion zum Abrufen der aktuellen Blockhöhe, und GetHeader , die Funktion zum Abrufen des Blockheaders, vorgestellt.

from ontology.interop.System.Blockchain import GetHeight, GetHeader 

1.1. Getheight


Mit GetHeight können Sie die neueste Blockhöhe abrufen, wie im folgenden Beispiel gezeigt. Im letzteren Beispiel wird der Einfachheit halber die Hauptfunktion weggelassen, Sie können sie jedoch bei Bedarf hinzufügen.

 from ontology.interop.System.Runtime import Notify from ontology.interop.System.Blockchain import GetHeight def Main(operation): if operation == 'demo': return demo() return False def demo(): height=GetHeight() Notify(height) # print height return height #return height after running the function 

1.2 GetHeader


Sie können GetHeader verwenden, um den Blockheader abzurufen, und der Parameter ist die Blockhöhe eines Blocks. Hier ist ein Beispiel:

 from ontology.interop.System.Runtime import Notify from ontology.interop.System.Blockchain import GetHeader def demo(): block_height=10 header=GetHeader(block_height) Notify(header) return header 

1.3 GetTransactionByHash


Sie können die GetTransactionByHash- Funktion verwenden, um Transaktionen über den Transaktions-Hash abzurufen . Der Transaktions-Hash wird als Parameter im Bytearray-Format an GetTransactionByHash gesendet. Der Schlüssel zu dieser Funktion ist, wie ein Transaktions-Hash im Hex-Format in einen Transaktions-Hash im Bytearray-Format konvertiert wird. Dies ist ein wichtiger Schritt. Andernfalls wird eine Fehlermeldung angezeigt, die darauf hinweist, dass dieser Block-Hash keinen Block enthält.

Nehmen wir als Beispiel den Transaktions-Hash im Hex-Format, um ihn in das Bytearray-Format zu konvertieren. Das Beispiel lautet wie folgt:

 9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1 

Kehren Sie zunächst den Transaktions-Hash um:

 c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279 

Entwickler können diesen Schritt mit dem von SmartX bereitgestellten Konvertierungswerkzeug Hex Number (Little Endian) <--> Number implementieren.

Konvertieren Sie es dann in das Bytearray-Format:

 {0xc1,0x89,0x0c,0x4d,0x73,0x06,0x26,0xdf,0xaa,0x94,0x49,0x41,0x9d,0x66,0x25,0x05,0xea,0xb3,0xbd,0xa2,0xe1,0xf0,0x1f,0x89,0x46,0x3c,0xc1,0xa4,0xa3,0x0a,0x27,0x9f} 

Entwickler können dies mit dem von SmartX bereitgestellten Konvertierungstool String <--> Byte Array tun. Konvertieren Sie abschließend den resultierenden Bytearray in die entsprechende Zeichenfolge:

 \xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f 

Unten finden Sie ein Beispiel für die Funktion GetTransactionByHash , mit der eine Transaktion über einen Transaktions-Hash abgerufen wird:

 from ontology.interop.System.Blockchain import GetTransactionByHash def demo(): # tx_hash="9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1" tx_hash=bytearray(b"\xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f") tx=GetTransactionByHash(tx_hash) return tx 

1.4 GetTransactionHeight


Entwickler können die GetTransactionHeight- Funktion verwenden, um die Transaktionshöhe über den Transaktions-Hash abzurufen . Nehmen wir den Hash im obigen Beispiel:

 from ontology.interop.System.Blockchain import GetTransactionHeight def demo(): # tx_hash="9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1" tx_hash=bytearray(b"\xc1\x89\x0c\x4d\x73\x06\x26\xdf\xaa\x94\x49\x41\x9d\x66\x25\x05\xea\xb3\xbd\xa2\xe1\xf0\x1f\x89\x46\x3c\xc1\xa4\xa3\x0a\x27\x9f") height=GetTransactionHeight(tx_hash) return height 

1.5 GetContract


Mit der GetContract-Funktion können Sie einen Vertrag über einen Vertrags-Hash abrufen. Der Konvertierungsprozess des Vertrags-Hashs steht im Einklang mit dem oben erwähnten Transaktions-Hash-Konvertierungsprozess.

 from ontology.interop.System.Blockchain import GetContract def demo(): # contract_hash="d81a75a5ff9b95effa91239ff0bb3232219698fa" contract_hash=bytearray(b"\xfa\x98\x96\x21\x32\x32\xbb\xf0\x9f\x23\x91\xfa\xef\x95\x9b\xff\xa5\x75\x1a\xd8") contract=GetContract(contract_hash) return contract 

1.6 GetBlock


Sie können die GetBlock-Funktion verwenden, um den Block abzurufen. Es gibt zwei Möglichkeiten, einen bestimmten Block zu erhalten:
1. Holen Sie sich den Block nach Blockhöhe:

 from ontology.interop.System.Blockchain import GetBlock def demo(): block=GetBlock(1408) return block 

2. Holen Sie sich den Block für Block-Hash:

 from ontology.interop.System.Blockchain import GetBlock def demo(): block_hash=bytearray(b'\x16\xe0\xc5\x40\x82\x79\x77\x30\x44\xea\x66\xc8\xc4\x5d\x17\xf7\x17\x73\x92\x33\x6d\x54\xe3\x48\x46\x0b\xc3\x2f\xe2\x15\x03\xe4') block=GetBlock(block_hash) 

2 Verwenden der Block-API


In der Block-API stehen drei Funktionen zur Verfügung: GetTransactions, GetTransactionCount und GetTransactionByIndex . Wir werden sie einzeln vorstellen.

2.1 GetTransactionCount


Mit der Funktion GetTransactionCount können Sie die Anzahl der Transaktionen für einen bestimmten Block abrufen .

 from ontology.interop.System.Blockchain import GetBlock from ontology.interop.System.Block import GetTransactionCount def demo(): block=GetBlock(1408) count=GetTransactionCount(block) return count 

2.2 GetTransactions


Mit der Funktion GetTransactions können Sie alle Transaktionen in einem bestimmten Block abrufen .

 from ontology.interop.System.Blockchain import GetBlock from ontology.interop.System.Block import GetTransactions def demo(): block=GetBlock(1408) txs=GetTransactions(block) return txs 

2.3 GetTransactionByIndex


Mit der Funktion GetTransactionByIndex können Sie bestimmte Transaktionen in einem bestimmten Block abrufen .

 from ontology.interop.System.Blockchain import GetBlock from ontology.interop.System.Block import GetTransactionByIndex def demo(): block=GetBlock(1408) tx=GetTransactionByIndex(block,0) # index starts from 0. return tx 

Das komplette Tutorial auf unserem GitHub finden Sie hier .

Nachwort


Die Blockchain & Block-API ist der unverzichtbarste Bestandteil intelligenter Verträge, da Sie damit Blockchain-Daten abfragen und Daten in intelligenten Verträgen blockieren können. In den nächsten Artikeln werden wir diskutieren, wie andere APIs verwendet werden, um ihre Interaktion mit der Ontologie-Blockchain zu untersuchen.



Bist du ein Entwickler? Stellen Sie sicher, dass Sie unserer Tech-Community auf Discord beigetreten sind. Besuchen Sie auch das Developer Center auf unserer Website. Dort finden Sie Entwicklertools, Dokumentation und mehr.

Finden Sie die Ontologie woanders


Ontologie-Website
Github / Zwietracht
Telegramm ( Englisch / Russisch )
Twitter / Reddit /

Source: https://habr.com/ru/post/de468821/


All Articles