Zum Inhalt

Börse

Integration des Prototyps mit Alephiums SDK: exchange.test.ts - Github

Dieser Leitfaden erläutert die grundlegenden APIs und Informationen, die für die Integration von Alephium mit einer Kryptowährungsbörse erforderlich sind.


Einstieg

Lokales Entwicklungsnetzwerk

Um mit Alephium zu integrieren, muss eine Börse einen Full Node betreiben. Zusätzlich kann das Explorer-Backend zu Debugging- und zusätzlichen Indexierungszwecken ausgeführt werden.

Um ein lokales Entwicklungsnetzwerk mit Explorer-Unterstützung zu erstellen, folgen Sie den Anweisungen im Alephium-Stack Repository. Sobald es gestartet ist, kann auf die Swagger UI für die API-Schnittstelle des Full Nodes und des Explorer-Backends zugegriffen werden.

APIs

Um den Leitfaden kurz zu halten, werden relevante API-Anfragen im Dokument bereitgestellt, anstatt Swagger UI-Screenshots zu verwenden.

Das web3 SDK enthält generierte TypeScript-APIs sowohl für den Full Node als auch für das Explorer-Backend.

Test wallet

Warnung

Die Node-Wallet dient dazu, die APIs des Full Nodes zu testen. Um Hot Wallets für Einzahlungen zu generieren, überprüfen Sie bitte Wallet-Generierung.

Lassen Sie uns die Test-Wallet wiederherstellen, indem wir die folgende API ausführen. Die Test-Wallet hat 1 Million ALPH für die Adresse 1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH.

Bash
curl -X 'PUT' \
  'http://127.0.0.1:22973/wallets' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "password": "test",
  "mnemonic": "vault alarm sad mass witness property virus style good flower rice alpha viable evidence run glare pretty scout evil judge enroll refuse another lava",
  "walletName": "test"
}'

# Response
# {
#   "walletName": "test"
# }

Erhalten Sie den öffentlichen Schlüssel der Adresse durch folgende Abfrage:

Bash
curl -X 'GET' \
  'http://127.0.0.1:22973/wallets/test/addresses/1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH' \
  -H 'accept: application/json'

# Response
# {
#   "address": "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH",
#   "publicKey": "0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0",
#   "group": 0,
#   "path": "m/44'/1234'/0'/0/0"
# }

Transaktions-APIs

Eine Transaktion erstellen

Lassen Sie uns eine Transaktion erstellen, um 1.23 ALPH an die Adresse 1C2RAVWSuaXw8xtUxqVERR7ChKBE1XgscNFw73NSHE1v3 zu senden.

Bash
# `fromPublicKey` is the public key of the wallet address

curl -X 'POST' \
  'http://127.0.0.1:22973/transactions/build' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "fromPublicKey": "0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0",
  "destinations": [
    {
      "address": "1C2RAVWSuaXw8xtUxqVERR7ChKBE1XgscNFw73NSHE1v3",
      "attoAlphAmount": "1230000000000000000"
    }
  ]
}'

# Response:
# {
#   "unsignedTx": "00040080004e20c1174876e8000137a444479fa782e8b88d4f95e28b3b2417e5bc30d33a5ae8486d4a8885b82b224259c1e6000381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b002c41111d67bb1bb000000a3cd757be03c7dac8d48bf79e2a7d6e735e018a9c054b99138c7b29738c437ec00000000000000000000c6d3c20ab5db74a5b8000000bee85f379545a2ed9f6cceb331288842f378cf0f04012ad4ac8824aae7d6f80a00000000000000000000",
#   "gasAmount": 20000,
#   "gasPrice": "100000000000",
#   "txId": "a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617",
#   "fromGroup": 0,
#   "toGroup": 1
# }

Transaktion signieren

Lassen Sie uns die Transaktions-ID signieren:

Bash
curl -X 'POST' \
  'http://127.0.0.1:22973/wallets/test/sign' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "data": "a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617"
}'

# Response
# {
#   "signature": "78a607ec26165b5a63d7e30a0c85657e8a0fe3b7efccdba78166e51b52c32c9020f921e0a29b6a436ec330c3b3eb2222ee851e718e3504b1a70d73ba45cd503c"
# }

Eine Transaktion einreichen

Lassen Sie uns die Transaktion an das Netzwerk übermitteln:

Bash
# `unsignedTx` is from the response of transaction building
# `signature` is from the response of transaction signing

curl -X 'POST' \
  'http://127.0.0.1:22973/transactions/submit' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "unsignedTx": "00040080004e20c1174876e8000137a444479fa782e8b88d4f95e28b3b2417e5bc30d33a5ae8486d4a8885b82b224259c1e6000381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b002c41111d67bb1bb000000a3cd757be03c7dac8d48bf79e2a7d6e735e018a9c054b99138c7b29738c437ec00000000000000000000c6d3c20ab5db74a5b8000000bee85f379545a2ed9f6cceb331288842f378cf0f04012ad4ac8824aae7d6f80a00000000000000000000",
  "signature": "78a607ec26165b5a63d7e30a0c85657e8a0fe3b7efccdba78166e51b52c32c9020f921e0a29b6a436ec330c3b3eb2222ee851e718e3504b1a70d73ba45cd503c"
}'

# Response
# {
#   "txId": "a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617",
#   "fromGroup": 0,
#   "toGroup": 1
# }

Block APIs

Blockhash mit Transaktions-ID abrufen

Um den Blockhash einer bestätigten Transaktion zu erhalten, können Sie die Full-Node-API verwenden:

Bash
curl -X 'GET' \
  'http://127.0.0.1:22973/transactions/status?txId=a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617' \
  -H 'accept: application/json'

# Response
# {
#   "type": "Confirmed",
#   "blockHash": "1d616d33a7aadc3cf49f5db1cc484b22a642140673f66020c13dc7648b9382d1",
#   "txIndex": 0,
#   "chainConfirmations": 1,
#   "fromGroupConfirmations": 1,
#   "toGroupConfirmations": 0
# }

Block mit Blockhash abrufen

Bash
curl -X 'GET' \
  'http://127.0.0.1:22973/blockflow/blocks-with-events/ecbc7a3115eb0da1f82902db226b80950e861ef8cbb6623ed02fc42a6eeb69cb' \
  -H 'accept: application/json'

# Response
# {
#   "block": {
#     "hash": "ecbc7a3115eb0da1f82902db226b80950e861ef8cbb6623ed02fc42a6eeb69cb",
#     "timestamp": 1231006505000,
#     "chainFrom": 2,
#     "chainTo": 3,
#     "height": 0,
#     ...
#   },
#   "events": []
# }

Abfrage von Blöcken

In Alephium können Sie alle Blöcke von allen Ketten für einen bestimmten Zeitintervall abrufen, da es sich um eine sharded Blockchain handelt, bei der mehrere Ketten gleichzeitig auf unterschiedlichen Höhen arbeiten.

Bash
curl -X 'GET' \
  'http://127.0.0.1:22973/blockflow/blocks?fromTs=0&toTs=30' \
  -H 'accept: application/json'

# Response: there are 16 chains, therefore 16 lists of block hashes
# {
#   "blocks": [
#     [],
#     ...
#     []
#   ]
# }

Sie können Blöcke für jede Kette einzeln mit diesem Endpunkt abrufen:

Bash
curl -X 'GET' \
  'http://127.0.0.1:22973/blockflow/chain-info?fromGroup=2&toGroup=3' \
  -H 'accept: application/json'

# Response
# {
#   "currentHeight": 0
# }

curl -X 'GET' \
  'http://127.0.0.1:22973/blockflow/hashes?fromGroup=2&toGroup=3&height=0' \
  -H 'accept: application/json'

# Response
# {
#   "headers": [
#     "ecbc7a3115eb0da1f82902db226b80950e861ef8cbb6623ed02fc42a6eeb69cb"
#   ]
# }


UTXO Verwaltung

Warum UTXO-Verwaltung?

In der Praxis neigen einige Miner dazu, Mining-Belohnungen direkt an Börsenadressen zu senden, was zu einer großen Anzahl von UTXOs mit geringem Wert in den Hot Wallets der Börse führt. Aufgrund der begrenzten Anzahl von Inputs, die in jede Transaktion aufgenommen werden können, können Auszahlungen fehlschlagen, wenn das Hot Wallet mit diesen kleinen UTXOs gefüllt ist.

Wie konsolidiert man UTXOs mit geringem Wert?

Wenn Ihre Börse bereits ein geeignetes UTXO-Verwaltungssystem hat, sind Sie gut aufgestellt. Wenn nicht, gibt es eine einfache Lösung. Sie können den Sweep-Endpunkt verwenden, um die UTXOs mit geringem Wert einer bestimmten Adresse zu konsolidieren. Beachten Sie, dass diese Funktion nur ab Full Node 2.3.0 verfügbar ist.

Bash
# `maxAttoAlphPerUTXO` refers to the maximum amount of ALPH in the UTXOs to be consolidated.

curl -X 'POST' \
  'http://127.0.0.1:22973/transactions/sweep-address/build' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "fromPublicKey": "0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0",
  "toAddress": "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH",
  "maxAttoAlphPerUTXO": "100 ALPH"
}'

Wie man mit bestimmten UTXOs arbeitet?

Um Transaktionen effizienter zu erstellen, wird einer Börse empfohlen, den Satz von UTXOs ihrer Hot Wallets zu speichern und dann spezifische UTXOs über die API bereitzustellen.

Bash
curl -X 'POST' \
  'http://127.0.0.1:22973/transactions/build' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "fromPublicKey": "0381818e63bd9e35a5489b52a430accefc608fd60aa2c7c0d1b393b5239aedf6b0",
  "destinations": [
    {
      "address": "1C2RAVWSuaXw8xtUxqVERR7ChKBE1XgscNFw73NSHE1v3",
      "attoAlphAmount": "230000000000000000"
    }
  ]
  "utxos": [
    {
        "hint": 714242201,
        "key": "3bfdeea82a5702cdd98426546d9eeecd744cc540aaffc5ec8ea998dc105da46f"
    }
  ]
}'

hint und key für den UTXO werden aus der ersten Ausgabe der ersten von uns erstellten Transaktion abgerufen. key ist eindeutig und kann verwendet werden, um den UTXO zu indizieren.

Bash
curl -X 'GET' \
  'http://127.0.0.1:22973/transactions/details/a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617' \
  -H 'accept: application/json'

# Response
# {
#   "unsigned": {
#     "txId": "a6c14ad03597ce96ebf78b336aded654395f38e0274c810183c4847d9af3d617",
#     ...
#     "fixedOutputs": [
#       {
#         "hint": 714242201,
#         "key": "3bfdeea82a5702cdd98426546d9eeecd744cc540aaffc5ec8ea998dc105da46f",
#         "attoAlphAmount": "1230000000000000000",
#         "address": "1C2RAVWSuaXw8xtUxqVERR7ChKBE1XgscNFw73NSHE1v3",
#         ...
#       },
#       {
#         "hint": 933512263,
#         "key": "087ee967733900cc7f7beada612ba514dd134ddffc2ad1b6ad8b6998915089c4",
#         "attoAlphAmount": "999998768000000000000000",
#         "address": "1DrDyTr9RpRsQnDnXo2YRiPzPW4ooHX5LLoqXrqfMrpQH",
#         ...
#       }
#     ]
#   },
#   ...
# }

Mehr Informationen

Wallet-Generierung

Um mehrere Adressen für Benutzer zu generieren, können Sie die HD-Wallet im Web3 SDK verwenden.

Sharding

Alephium ist eine sharded Blockchain, und seine Adressen sind auf dem Mainnet in 4 Gruppen unterteilt. Man kann jedoch: - ALPH an mehrere Adressen derselben Adressgruppe in einer einzigen Transaktion senden. Alle Zieladressen müssen derselben Gruppe angehören. - ALPH von mehreren Adressen derselben Adressgruppe in einer einzigen Transaktion senden. Alle sendenden Adressen müssen derselben Gruppe angehören. - ALPH von mehreren Adressen derselben Gruppe an mehrere Adressen einer anderen Gruppe senden. Alle sendenden Adressen müssen derselben Gruppe angehören, und alle Zieladressen müssen ebenfalls derselben Gruppe angehören.

Um die Gruppe einer Adresse zu erhalten, können Sie auf die Web3 SDK-Funktion groupOfAddress(address) verweisen.

Gasberechnung

Die Transaktionsgebühren von Alephium werden durch die zugewiesene Gasmenge und den Gaspreis bestimmt. Pro Transaktion können maximal 625.000 Gas zugewiesen werden. Der Standard-Gaspreis beträgt 1e11 AttoALPH pro Gas-Einheit. Bei einer einfachen Übertragungstransaktion kann die Gasmenge mit dem folgenden Pseudocode berechnet werden:

TypeScript
txInputBaseGas = 2000
txOutputBaseGas = 4500
inputGas = txInputBaseGas * tx.inputs.length
outputGas = txOutputBaseGas * tx.outputs.length

txBaseGas = 1000
p2pkUnlockGas = 2060 // Currently there is only one signature

txGas = inputGas + outputGas + txBaseGas + p2pkUnlockGas
minimalGas = 20000

gas = max(minimalGas, txGas)