Sicherheitspraktiken in der Spieleentwicklung (1): Hallo Welt

Sichere Entwicklungspraktiken in Move lernen und eine Aptos-Anwendung erstellen mit dieser umfassenden Anleitung.

Sicherheitspraktiken in der Spieleentwicklung (1): Hallo Welt

Mit dem Start des Mainnets des Aptos-Netzwerks am 18. Oktober erweitern die Programmiersprache Move und ihr Ökosystem kontinuierlich ihren Einfluss. Um die Community einzubinden, werden wir eine Reihe von Artikeln veröffentlichen, die sichere Entwicklungspraktiken in Move vorstellen. Wir führen Sie durch Beispiele, Erklärungen und vor allem Sicherheitspraktiken in die Welt von Move ein.

TL;DR

Dieser Artikel wird Ihnen Folgendes erklären:

  • wie man eine Aptos-Anwendung erstellt und entwickelt;
  • wie ein Modul (d. h. ein Smart Contract in Move) aussieht;
  • wie man ein Modul auf seinem lokalen Netzwerk kompiliert und veröffentlicht;
  • wie man mit dem Modul interagiert und das emittierte Ereignis im Browser überprüft.

0x1. Über Move und sein Ökosystem

Move ist eine Weiterentwicklung von Diem (der Name war vor Dezember 2020 Libra), das für die Entwicklung von Smart Contracts konzipiert wurde. Es wird als sicher, schnell und flexibel bezeichnet und zielt darauf ab, die Sprache der nächsten Generation zu werden. Die neu eingeführten Projekte wie Aptos und Sui übernehmen jedoch nicht das ursprüngliche Move direkt, sondern haben einige Modifikationen vorgenommen, um ihren Anforderungen gerecht zu werden.

Sofern nicht anders angegeben, werden wir uns hauptsächlich auf die Entwicklungspraktiken im Kontext von Aptos konzentrieren, da die Ideen für andere Move-basierte Projekte generisch sind. Wir gehen auch davon aus, dass Sie bereits das MoveBook für ein grundlegendes Verständnis der Move-Programmiersprache durchgearbeitet haben.

0x2. Umgebung vorbereiten

0x2.1 Aptos Toolchain

Aptos hat Move bereits in seine CLI integriert. Daher wird empfohlen, die CLI-Installation zu befolgen, um die entsprechende Toolchain zu installieren. Sobald die Installation abgeschlossen ist, geben Sie aptos im Terminal ein, und Sie sollten die folgende Ausgabe sehen:

$ aptos
aptos 1.0.1
Aptos Labs <[email protected]>
Command Line Interface (CLI) for developing and interacting with the Aptos blockchain
USAGE:
    aptos <SUBCOMMAND>
OPTIONS:
    -h, --help       Print help information
    -V, --version    Print version information
SUBCOMMANDS:
    account       Tool for interacting with accounts
    config        Tool for interacting with configuration of the Aptos CLI tool
    genesis       Tool for setting up an Aptos chain Genesis transaction
    governance    Tool for on-chain governance
    help          Print this message or the help of the given subcommand(s)
    info          Show build information about the CLI
    init          Tool to initialize current directory for the aptos tool
    key           Tool for generating, inspecting, and interacting with keys
    move          Tool for Move related operations
    node          Tool for operations related to nodes
    stake         Tool for manipulating stake and stake pools

0x2.2 Lokales Testnet und Konto

Aptos bietet mehrere Netzwerke (d. h. Mainnet, Testnet, Devnet und lokales Testnet) für Entwicklung und Bereitstellung. In diesem Artikel verwenden wir das lokale Testnet.

Um das lokale Testnet zu starten, geben Sie den folgenden Befehl ein:

$ aptos node run-local-testnet --with-faucet --force-restart

Sie sollten die folgende Ausgabe sehen:

......
Aptos is running, press ctrl-c to exit
Faucet is running.  Faucet endpoint: 0.0.0.0:8081

Jetzt können Sie Ihr Konto erstellen, indem Sie den folgenden Befehl eingeben (wahrscheinlich in einem anderen Terminalfenster, wenn Sie das vorherige im Vordergrund lassen möchten):

$ aptos init

Dieser Befehl öffnet eine interaktive Shell, die die Angabe einiger Eigenschaften erfordert. Hier wählen wir das local-Netzwerk. Danach wird im aktuellen Verzeichnis ein Ordner .aptos mit Ihrer Standardkontokonfiguration darin erstellt. Überprüfen Sie die Datei und kopieren Sie Ihre account-Adresse (z. B. c0d8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx14bd).

Tipp#1: Bewahren Sie Ihre Kontokonfigurationsdatei sicher auf! Ihr privater Schlüssel ist darin geschrieben!

0x3. Das erste Hello World-Programm

Das Hello World-Programm wird immer als erster Schritt beim Erlernen des Codings verwendet. Wir möchten diese Konvention befolgen, um die Art und Weise der Entwicklung von Move-Anwendungen zu demonstrieren.

0x3.1 Paket vorbereiten

Wählen Sie ein Verzeichnis Ihrer Wahl und geben Sie den folgenden Befehl ein:

$ aptos move init --framework-local-dir "../../aptos-core/aptos-move/framework/aptos-framework" --name hello

Dieser Befehl erstellt ein neues Move-Paket am angegebenen Ort (d. h. im Entwicklungsarbeitsbereich). Da einige Bibliotheksfunktionen im Aptos-Framework erforderlich sind, wird das lokale Verzeichnis des Aptos-Frameworks angegeben (der relative Pfad muss möglicherweise für einen anderen Speicherort geändert werden); alternativ kann auch die Git-Revision oder der Branch für das Aptos-Framework mit --framework-git-rev angegeben werden.

Nun sehen Sie eine Datei Move.toml in Ihrem Verzeichnis. Diese Datei listet nicht nur einige Abhängigkeitskonfigurationen auf, sondern beschreibt auch den Paketnamen und die Version. Außerdem gibt es einen Ordner namens sources, der zur Speicherung des Move-Quellcodes verwendet wird. Nach der Erstellung einer .move-Datei im sources-Verzeichnis ist der Arbeitsbereich einsatzbereit.

[package]
name = 'hello'
version = '1.0.0'
[dependencies.AptosFramework]
local = '../../aptos-core/aptos-move/framework/aptos-framework'
[addresses]
BlockSec="c0d8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx14bd"

In der letzten Zeile von Move.toml verknüpfen wir die Kontoadresse (gerade zuvor erstellt) mit BlockSec. Dies wird verwendet, um das Modul (d. h. den Smart Contract) in diesem Paket zu veröffentlichen (wird später besprochen). Beachten Sie, dass die obige Adresse nur ein Platzhalter ist und Sie sie DURCH IHRE EIGENE KONTOADRESSE ersetzen MÜSSEN.

0x3.2 Modul vorbereiten

Unten finden Sie ein einfaches, aber vollständiges Beispielmodul, das direkt in die Move-Datei (z. B. hello.move) eingefügt werden kann. Im Folgenden möchten wir den Code durchgehen, um den Unterschied zwischen Move und anderen Programmiersprachen zu verdeutlichen. Diesen Abschnitt können Sie überspringen, wenn Sie damit sehr vertraut sind.

module BlockSec::hello{
    use aptos_framework::account;
    use aptos_framework::event;
    use std::signer;
    use std::string::{String, utf8};
    struct SecEventStore has key{
        event_handle: event::EventHandle<String>,
    }
    public entry fun say_hello_script(account: &signer) acquires SecEventStore{
        say_hello(account);
    }
    public fun say_hello(account: &signer) acquires SecEventStore{
        let address_ = signer::address_of(account);
        if(!exists<SecEventStore>(address_)){
            move_to(account, SecEventStore{event_handle: account::new_event_handle(account)});
        };
        event::emit_event<String>(&mut borrow_global_mut<SecEventStore>(address_).event_handle, utf8(b"Hello World!"));
    }
}

Hier definieren wir ein Modul namens hello, das unter der Adresse BlockSec veröffentlicht wird. Die Einstiegsfunktion dieses Moduls heißt say_hello_script, die die Funktion say_function aufruft. Es ist leicht zu erkennen, dass dieses Modul verwendet wird, um ein Ereignis mit der Nachricht "Hello World!" auszugeben (in der Funktion say_hello). Es gibt jedoch noch einige Details, die klar erklärt werden müssen.

Insbesondere müssen wir, um die Funktion event::emit_event im Namensraum aptos_framework verwenden zu können, eine event::EventHandle-Struktur haben, da die Funktion emit_event die folgende Deklaration hat:

/// Emit an event with payload `msg` by using `handle_ref`'s key and counter.
public fun emit_event<T: drop + store>(handle_ref: &mut EventHandle<T>, msg: T)
struct EventHandle<phantom T: drop + store> has store {
    /// Total number of events emitted to this event stream.
    counter: u64,
    /// A globally unique ID for this event stream.
    guid: GUID,
}

Beachten Sie, dass EventHandle nicht die Fähigkeit key hat, was bedeutet, dass wir es in einer anderen Struktur speichern müssen. Daher definieren wir eine Struktur namens SecEventStore, um EventHandle zu speichern:

struct SecEventStore has key{
    event_handle: event::EventHandle<String>,
}

Tipp#2: Wir müssen die Fähigkeiten einer Struktur in Move berücksichtigen. Denken Sie daran, dass nur die Fähigkeit **_key_** mit **_move_to_** verwendet werden kann. Wenn ein Modul eine Struktur zurückgibt, die nur die **_store_** Fähigkeit hat und Sie sie im globalen Speicher behalten möchten, sollten Sie eine neue Struktur als Wrapper definieren.

Der Einfachheit halber verwenden wir String, um die Nachricht darzustellen. Der letzte Schritt der Funktion say_hello ist also:

event::emit_event<String>(&mut borrow_global_mut<SecEventStore>(address_).event_handle, utf8(b"Hello World!"));

Tipp#3: Move unterstützt den **_String_** Datentyp nicht nativ. Die Standardbibliothek ermöglicht die Übertragung eines Byte-Vektors in einen **_String_**. Weitere Details finden Sie im Quellcode im GitHub-Repository.

Um sicherzustellen, dass sich jeder neue Benutzer mit einem SecEventStore registriert, müssen wir zunächst die Existenz der Struktur im Benutzerkonto über die Funktion exists überprüfen. Wenn der Benutzer die Ressource nicht hat, erstellt die Funktion eine und verschiebt sie in das Benutzerkonto.

if(!exists<SecEventStore>(address_)){
    move_to(account, SecEventStore{event_handle: account::new_event_handle(account)});
};

0x3.3 Modul kompilieren und veröffentlichen

Wenn das Modul bereit ist, können wir es mit dem folgenden Befehl kompilieren:

$ aptos move compile
Compiling, may take a little while to download git dependencies...
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING hello
{
  "Result": [
    "c0d8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx14bd::hello"
  ]
}

Wir können es bei Bedarf auch testen:

$ aptos move test
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING hello
Running Move unit tests
Test result: OK. Total tests: 0; passed: 0; failed: 0
{
  "Result": "Success"
}

Nun können wir das Modul im Aptos-Netzwerk bereitstellen. Denken Sie daran, dass wir das Konto mit BlockSec verknüpft haben, da ein Benutzer nur Module auf Konten veröffentlichen kann, die ihm gehören. Außerdem hat der Faucet das Konto bereits mit einigen APTs zur Bezahlung von Gasgebühren ausgestattet. Das Einzige, was noch zu tun ist, ist die Veröffentlichung des Moduls im Move-Paket im Aptos-Netzwerk, wie folgt:

$ aptos move publish --package-dir ./ --profile default
Compiling, may take a little while to download git dependencies...
INCLUDING DEPENDENCY AptosFramework
INCLUDING DEPENDENCY AptosStdlib
INCLUDING DEPENDENCY MoveStdlib
BUILDING hello
package size 1271 bytes
Do you want to submit a transaction for a range of [672200 - 1008300] Octas at a gas unit price of 100 Octas? [yes/no] >
yes
{
  "Result":
  ...
}

Dies ist ebenfalls eine interaktive Shell, und der Inhalt von Result wird ausgelassen.

0x3.4 Mit dem Modul interagieren

Damit das Modul das Ereignis ausgibt, geben Sie einfach den folgenden Befehl ein:

$ aptos move run --function-id default::hello::say_hello_script
Do you want to submit a transaction for a range of [34500 - 51700] Octas at a gas unit price of 100 Octas? [yes/no] >
yes
{
  "Result": {
    "transaction_hash": "0x9af16532de5e79803c823fe28e3251703927d93809274b76972d8e83c6fcd433",
    ...
    }
}

Als Einstiegsfunktion kann die Funktion say_hello_script direkt aufgerufen werden. Sie können auch ein Skript schreiben und die Funktion say_hello in Ihrem Skript aufrufen.

Tipp#4: Für eine bessere Interaktion ist die Definition einiger Einstiegsfunktionen eine gute Praxis. Sie können auch Skripte entwickeln, damit Benutzer mit Ihrem Projekt interagieren können.

Im Gegensatz zum traditionellen Web2-Hello-World-Programm wird das ausgegebene Ereignis nicht in der Shell angezeigt. Überprüfen Sie den Aptos Explorer und wählen Sie das local-Netzwerk aus.

Kopieren Sie dann den Wert von transaction_hash aus der Shell und fügen Sie ihn in die Suchleiste ein, und Sie sehen die Transaktionsdetails.

Klicken Sie schließlich auf Events, und das Aptos-Netzwerk wird Ihnen seine Grüße übermitteln.

0x4. Was kommt als Nächstes?

Das Hello World-Programm ist nur ein kleiner Schritt zur Entwicklung von Move-Anwendungen. In der kommenden Artikelreihe werden wir mehr über die Entwicklung sicherer Move-Anwendungen auf Aptos einführen. Bleiben Sie dran!

Über BlockSec

BlockSec ist ein führendes Blockchain-Sicherheitsunternehmen, das 2021 von einer Gruppe weltweit renommierter Sicherheitsexperten gegründet wurde. Das Unternehmen engagiert sich für die Verbesserung der Sicherheit und Benutzerfreundlichkeit der aufkommenden Web3-Welt, um ihre Massenadoption zu fördern. Zu diesem Zweck bietet BlockSec Sicherheitsaudits für Smart Contracts und EVM-Chains, die Phalcon-Plattform für die Sicherheitsentwicklung und proaktive Bedrohungsblockierung, die MetaSleuth-Plattform für die Nachverfolgung und Untersuchung von Geldern sowie die MetaSuites-Erweiterung für Web3-Entwickler, um effizient in der Krypto-Welt zu navigieren.

Bis heute hat das Unternehmen über 300 angesehene Kunden wie MetaMask, Uniswap Foundation, Compound, Forta und PancakeSwap betreut und in zwei Finanzierungsrunden von namhaften Investoren wie Matrix Partners, Vitalbridge Capital und Fenbushi Capital zweistellige Millionenbeträge erhalten.

Offizielle Website: https://blocksec.com/

Offizieller Twitter-Account: https://twitter.com/BlockSecTeam

Sign up for the latest updates