Wie man einen Smart Contract in Python im Ontology-Netzwerk schreibt. Teil 1: Blockchain & Block-API

Wie man einen Smart Contract in Python im Ontology-Netzwerk schreibt. Teil 1: Blockchain & Block API

Dies ist der erste Teil einer Reihe von Lehrartikeln über die Erstellung von Smart Contracts in Python im Ontology-Blockchain-Netzwerk mithilfe des Smart Contract-Entwicklungstools. SmartX.

In diesem Artikel beginnen wir mit der Einführung in die API des Ontology-Smart Contracts. Die API des Ontology-Smart Contracts ist in 7 Module unterteilt:

  1. Blockchain & Block API,
  2. Runtime API,
  3. Storage API,
  4. Native API,
  5. Upgrade API,
  6. Execution Engine API und
  7. Static & Dynamic Call API.

Blockchain & Block API ist der Hauptbestandteil des Ontology-Smart Contractsystems. Die Blockchain API unterstützt grundlegende Blockchain-Abfrageoperationen, wie das Abrufen der aktuellen Blockhöhe, während die Block API grundlegende Block-Abfrageoperationen unterstützt, wie z. B. das Abfragen der Anzahl der Transaktionen für einen bestimmten Block.

Lass uns anfangen!

Zuerst erstellen Sie einen neuen Vertrag in SmartX, und folgen Sie dann den nachstehenden Anweisungen.

1. So verwenden Sie die Blockchain API

Die Links zu den Smart Contract-Funktionen sind identisch mit den Links in Python. Sie können die entsprechenden Funktionen nach Bedarf eingeben. Beispielsweise führt die folgende Anweisung die Funktion GetHeight ein - eine Funktion zum Abrufen der aktuellen Blockhöhe, und GetHeader - eine Funktion zum Abrufen des Blockheaders.

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

GetHeight

GetHeight wird verwendet, um die letzte Reihenfolge eines Blocks in der Blockchain zu erhalten, wie im folgenden Beispiel gezeigt. Im letzten Beispiel lassen wir die Main-Funktion der Einfachheit halber weg, aber Sie können sie hinzufügen, wenn nötig.

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

GetHeader

GetHeader wird verwendet, um den Blockheader abzurufen, wobei der Parameter die Reihenfolge des Blocks in der Blockchain ist. 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

GetTransactionByHash

GetTransactionByHash wird verwendet, um eine Transaktion über den Transaktionshash abzurufen. Der Transaktionshash wird als Parameter im bytearray-Format übergeben. Der Schlüssel zu dieser Funktion ist die Umwandlung des Transaktionshashs im hexadezimalen Format in den Transaktionshash im bytearray-Format. Dies ist ein wichtiger Schritt. Andernfalls erhalten Sie eine Fehlermeldung, die darauf hinweist, dass kein Block mit diesem Blockhash exists. Lassen Sie uns den Transaktionshash im hexadezimalen Format als Beispiel verwenden, um ihn in das bytearray-Format umzuwandeln. Das Beispiel sieht wie folgt aus: GetTransactionByHash 9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1

Zuerst kehren Sie den Transaktionshash um:

Zuerst kehren Sie den Transaktions-Hash um:

c1890c4d730626dfaa9449419d662505eab3bda2e1f01f89463cc1a4a30a279

Entwickler können diesen Schritt mit dem von SmartX bereitgestellten Hex Number (little endian) Number-Konvertierungswerkzeug durchführen.

Konvertieren Sie dann das erhaltene Ergebnis in das Format bytearray:

{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}

Dies kann mit dem von SmartX bereitgestellten String Byte Array-Konvertierungswerkzeug erfolgen. Schließlich konvertieren Sie das erhaltene bytearray in eine ähnliche Zeichenkette:

xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f

Im Folgenden finden Sie ein Beispiel für die Funktion GetTransactionByHash, die eine Transaktion anhand des Transaktionshashs abruft:

from ontology.interop.System.Blockchain import GetTransactionByHash
def demo():
    # tx_hash="9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1"    
    tx_hash=bytearray(b"xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f")
    tx=GetTransactionByHash(tx_hash)
    return tx

GetTransactionHeight

GetTransactionHeight wird verwendet, um die Höhe der Transaktion anhand des Transaktionshashs abzurufen. Lassen Sie uns den Hash aus dem obigen Beispiel verwenden:

from ontology.interop.System.Blockchain import GetTransactionHeight
def demo():
    #   tx_hash="9f270aa3a4c13c46891ff0e1a2bdb3ea0525669d414994aadf2606734d0c89c1"    
    tx_hash=bytearray(b"xc1x89x0cx4dx73x06x26xdfxaax94x49x41x9dx66x25x05xeaxb3xbdxa2xe1xf0x1fx89x46x3cxc1xa4xa3x0ax27x9f")
    height=GetTransactionHeight(tx_hash)
    return height

GetContract

Entwickler können die Funktion GetContract verwenden, um einen Vertrag anhand des Vertrags-Hashes abzurufen. Der Prozess der Konvertierung des Vertrags-Hashes entspricht dem oben genannten Prozess zur Konvertierung des Transaktions-Hashes.

from ontology.interop.System.Blockchain import GetContract
def demo():
    # contract_hash="d81a75a5ff9b95effa91239ff0bb3232219698fa"    
    contract_hash=bytearray(b"xfax98x96x21x32x32xbbxf0x9fx23x91xfaxefx95x9bxffxa5x75x1axd8")
    contract=GetContract(contract_hash)
    return contract

GetBlock

GetBlock wird verwendet, um einen Block abzurufen. Es gibt zwei Möglichkeiten, einen bestimmten Block zu erhalten.

1. Einen Block nach Blockhöhe abrufen:

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

2. Einen Block nach Block-Hash abrufen:

from ontology.interop.System.Blockchain import GetBlock
def demo():    
    block_hash=bytearray(b'x16xe0xc5x40x82x79x77x30x44xeax66xc8xc4x5dx17xf7x17x73x92x33x6dx54xe3x48x46x0bxc3x2fxe2x15x03xe4')
    block=GetBlock(block_hash)

2. Wie man die Block-API verwendet

Es gibt drei verfügbare Funktionen in der Block-API: GetTransactions, GetTransactionCount, und GetTransactionByIndex. Wir werden sie nacheinander behandeln.

GetTransactionCount

GetTransactionCount wird verwendet, um die Anzahl der Transaktionen für diesen Block abzurufen.

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

GetTransactions

Entwickler können die Funktion GetTransactions nutzen, um alle Transaktionen in diesem Block abzurufen.

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

GetTransactionByIndex

GetTransactionByIndex wird verwendet, um eine bestimmte Transaktion in diesem Block abzurufen.

von ontology.interop.System.Blockchain import GetBlock
von ontology.interop.System.Block import GetTransactionByIndex
def demo():
    block=GetBlock(1408)
    tx=GetTransactionByIndex(block,0) # Der Index beginnt bei 0.
    return tx

Eine vollständige Anleitung finden Sie in unserem GitHub.

Nachwort

Die Blockchain & Block API ist ein unverzichtbarer Teil von Smart Contracts, da Sie sie verwenden können, um Daten aus der Blockchain und dem Block in Smart Contracts abzufragen. In den folgenden Artikeln werden wir erörtern, wie die anderen APIs verwendet werden können und welche Wechselwirkungen sie mit der Ontology-Blockchain haben.

Der Artikel wurde von der Redaktion Hashrate&Shares speziell für OntologyRussia übersetzt. Klick

Sind Sie Entwickler? Treten Sie unserer technischen Gemeinschaft bei auf Discord. Schauen Sie auch in das Entwicklerzentrum auf unserer Website, wo Sie Entwicklerwerkzeuge, Dokumentationen und vieles mehr finden können.

Ontology

Quelle: habr.com

60GB SSD 8Gb DDR4