【ブロックチェーン】EOSIO WAX SDKのピュアPython実装をリリース

レビュー

「[ブロックチェーン] Python で WAX チェーン ゲーム スクリプトを開発するための共通ツール」
前回の記事で、Python が EOS または WAX ネットワークとやり取りするための 2 つのサードパーティ製オープン ソース ライブラリ [eospy] と [pyeoskit] を紹介しました。
ただし、詳細に使用した後、これら 2 つのライブラリには多かれ少なかれ欠点があり、どちらもニーズを完全に満たすことができないことがわかりました。

必要

それを整理するために、私たちのニーズは何ですか?これらのライブラリを使用する主な目的は、WAX チェーン ゲームの自動化スクリプトを開発することです。これは、クライアント側の DAPP を開発するための要件とは多少異なります。

たとえば、[eosjs] は Web クライアント (ブラウザー) で一般的に使用され、ユーザーに直接向けられています. 多くの場合、ユーザーは同時にアカウントにログインするだけでよく、手動操作で半自動的にトランザクションを送信する必要はありません.プロキシの問題に対処する必要があります. プロキシはブラウザの設定に依存します.

自動化されたロボットは、多くの場合、1 つのプロセスで数百または数千のアカウントを管理する必要があり、同時に複数の rpc ノードに接続し、プロキシ プールを使用して HTTP 要求を開始し、同時に各エラーを慎重に処理してログ記録を作成する必要があります。

最終的に、自分たちのニーズに基づいて eos api ライブラリのピュア python 実装を開発することにしたので、2 日かかり、[eosapi] が誕生しました。

エオサピ

ここに画像の説明を挿入

[eosapi] プロジェクトアドレス: https://github.com/encoderlee/eosapi

pypi に公開: https://pypi.org/project/eosapi

pipで直接インストール可能

pip install eosapi

ポジション

[eosapi] のホームページで説明されているように、[eosapi] には 4 つの主な機能があります。

1.シンプル

使い方は非常に簡単です。目標を達成するために最小限のコードを使用してみてください。これも eos トークンの転送の例です。

from eosapi import EosApi
api = EosApi(rpc_host="https://jungle3.greymass.com")
api.import_key("consumer1111", "5KWxgG4rPEXzHnRBaiVRCCE6WAfnqkRpTu1uHzJoQRzixqBB1k3")
trx = {
    
    
    "actions": [{
    
    
        "account": "eosio.token",
        "name": "transfer",
        "authorization": [
            {
    
    
                "actor": "consumer1111",
                "permission": "active",
            },
        ],
        "data": {
    
    
            "from": "consumer1111",
            "to": "consumer2222",
            "quantity": "0.0001 EOS",
            "memo": "by eosapi",
        },
    }]
}
resp = api.push_transaction(trx)

2.ハイレベル

[eosapi] は、いくつかの一般的な機能をカプセル化するための高レベル API を提供します。

例えば、先ほどのCPU決済「【WAXチェーンゲーム】CPUリソースのEOSネットワーク第三者決済【実装コード】」

今回は決済代行機能が【eosapi】に統合され、自分でtrxの認可を変更することなく、また複数の秘密鍵署名のマージの問題に対処することなく、1つの機能だけで実現できるようになりました。

from eosapi import EosApi

account_name = "consumer1111"
private_key = "5KWxgG4rPEXzHnRBaiVRCCE6WAfnqkRpTu1uHzJoQRzixqBB1k3"
payer_name = "payer2222222"
payer_private_key = "5KAskRRbqYVCRhZxLXqeg9yvWYQQHifDtf7BPceZUDw6zybjaQh"

api = EosApi(rpc_host="https://jungle3.greymass.com")
api.import_key(account_name, private_key)
api.set_cpu_payer(payer_name, payer_private_key)

def main():
    print("transfer EOS token from [consumer1111] to [consumer2222] by eospy")
    print("but let [payer2222222] pay for CPU/NET resources of this transaction")
    trx = {
    
    
        "actions": [{
    
    
            "account": "eosio.token",
            "name": "transfer",
            "authorization": [
                {
    
    
                    "actor": account_name,
                    "permission": "active",
                },
            ],
            "data": {
    
    
                "from": account_name,
                "to": "consumer2222",
                "quantity": "0.0001 EOS",
                "memo": "by eosapi",
            },
        }]
    }
    resp = api.push_transaction(trx)
    print("transaction ok: {0}".format(resp))

if __name__ == '__main__':
    main()

サンプル コードを見ることができます。set_cpu_payer を呼び出すだけで、EosApi インスタンスによって開始されたトランザクションによって、set_cpu_payer によって指定されたアカウントが CPU/NET リソースに対して支払われます。これは、WAX チェーン ゲーム スクリプトを開発する場合に非常に便利です。スクリプトは多くの場合、何千ものアカウントを管理する必要があり、これらのアカウントは多くの場合 0 プレッジであり、すべて支払い機能に依存して動作するためです。

3.軽量

[eosapi] は軽量のライブラリで、現在 550 行の Python コード (空白行を含む) しかなく、[eosjs] には合計 9451 行のコードがあります。

[eosapi] は主にスクリプトの自動開発に重点を置いているため、eosio チェーン API のすべての機能を実装しているわけではありません:
https://developers.eos.io/manuals/eos/latest/nodeos/plugins/chain_api_plugin/api-reference/index

軽量の利点はコードが読みやすいことですが、学習目的であれば、[eosapi] のコードを読む方が [eosjs] を読むよりもはるかに簡単です。

もちろん、今後も改善を続けていきますが、今のところはこれで十分です。

4.柔軟

【Eosapi】 高水準のクラスライブラリでありながら、柔軟性にも優れています。

一般的に言えば、高レベルの API にカプセル化されているほど、一般的に柔軟性が低くなり、一部の内部パラメーターの詳細はブロックされているため、変更が困難になります。しかし、私たちは[requests]の設計コンセプトを学びました, これは使いやすい高レベル API を提供します. デフォルトのパラメータの下では, 柔軟性を失うことなく簡単に呼び出すことができます. また, 内部の詳細をカスタマイズすることもできます. HTTP 要求ヘッダーのすべてのパラメーターを変更したり、302 をリダイレクトするかどうかを決定したり、タイムアウト値を変更したり、複数の種類のプロキシを設定したり、ssl 証明書を指定したり、HTTP 動詞をカスタマイズしたりすることもできます。

from eosapi import EosApi, NodeException, TransactionException
from requests import RequestException

account_name = "consumer1111"
private_key = "5KWxgG4rPEXzHnRBaiVRCCE6WAfnqkRpTu1uHzJoQRzixqBB1k3"

api = EosApi(rpc_host="https://jungle3.greymass.com", timeout=60)
api.import_key(account_name, private_key)

def main():
    print("transfer EOS token from [consumer1111] to [consumer2222] by eosapi")
    trx = {
    
    
        "actions": [{
    
    
            "account": "eosio.token",
            "name": "transfer",
            "authorization": [
                {
    
    
                    "actor": account_name,
                    "permission": "active",
                },
            ],
            "data": {
    
    
                "from": account_name,
                "to": "consumer2222",
                "quantity": "0.0001 EOS",
                "memo": "by eosapi",
            },
        }]
    }
    try:
        resp = api.push_transaction(trx)
        print("transaction ok: {0}".format(resp))
    except RequestException as e:
        print("network error: {0}".format(str(e)))
    except NodeException as e:
        print("eos node error, http status code {0}, response text: {1}".format(e.resp.status_code, e.resp.text))
    except TransactionException as e:
        print("eos transaction error, http status code {0}, response text: {1}".format(e.resp.status_code, e.resp.text))


def advance():
    # api.session isinstance of requests.Session
    # you can modify any of its properties

    # e.g If you want to set up an http proxy
    proxy = "127.0.0.1:1081"
    api.session.proxies = {
    
    
        "http": "http://{0}".format(proxy),
        "https": "http://{0}".format(proxy),
    }

    # e.g if you want to modify the http request header
    api.session.headers["User-Agent"] = "Mozilla/5.0"


if __name__ == '__main__':
    main()

上記のサンプル コードからわかるように、[eosapi] は内部で [requests] を介して HTTP リクエストを開始し、同時に内部の [session] オブジェクトを公開します。この [api.session] は実際には [requests.Session] です。 [requests] に精通している友人は、HTTP リクエストを送信するときに [eosapi] の動作に影響を与えるために、そのパラメーターを変更できることをすぐに理解するでしょう。

同時に、このサンプル コードでは、トランザクションの送信時に [eosapi] が明確に 3 つの例外をスローすることがわかります。これは、3 つの異なるタイプのエラーを表しています。


1. [ RequestException ]: ネットワーク タイムアウト、ネットワークの中断、プロキシの問題などのネットワーク エラーhttp 429 または http 403 のサービス拒否を返す
3. [TransactionException] トランザクション エラー、つまりトランザクションは送信されたが、CPU 不足、残高不足、署名エラー、権限の問題、スマート コントラクト エラーなどの理由で、return http 500 エラー

pack_trx

もう 1 つの重要な機能は、トランザクションをpacked_trx にパックすることです。サンプル コードを参照してください。

from eosapi import EosApi, Transaction
from requests import RequestException

api = EosApi(rpc_host="https://jungle3.greymass.com")

def main():
    print("packe transaction to packed_trx")
    trx = {
    
    
        "actions": [{
    
    
            "account": "eosio.token",
            "name": "transfer",
            "authorization": [
                {
    
    
                    "actor": "consumer1111",
                    "permission": "active",
                },
            ],
            "data": {
    
    
                "from": "consumer1111",
                "to": "consumer2222",
                "quantity": "0.0001 EOS",
                "memo": "by eosapi",
            },
        }]
    }
    trx = api.make_transaction(trx)
    packed_trx = list(trx.pack())
    print("packed_trx: {0}".format(packed_trx))

if __name__ == '__main__':
    main()

[packed_trx] は主に [ホスティングアカウント] と [フリー CPU] に使用されます。

【預かり口座】:

たとえば、ワックス クラウド ウォレットの秘密鍵はワックス クラウド ウォレット サーバーでホストされているため、ワックス クラウド ウォレットの自動化を実現するには、トランザクションを [packed_trx] にパックしてから、ワックス クラウド ウォレット サーバーhttps://public-wax -on.wax.io/wam/signに署名してから、WAX ネットワークに送信します。

【ホワイトCPU】:

[Alien Worlds]をプレイすると、各アカウントには 1 日あたり一定数の無料コレクションがあることがわかります。

アトミック マーケットで NFT を送信すると、アカウント 0 がプレッジされていても送信できることがわかります。

待ってください。一部の操作では CPU を消費する必要がないことがわかりました。

どうして?実際、プロジェクト パーティーは EOSIO の [ONLY_BILL_FIRST_AUTHORIZER] 機能を使用して、アカウントの支払いを行いました。

ウェブページを手動で操作すると、プロジェクト関係者が書いたjavascriptコードがトランザクションを処理するので、マウスを動かすだけで無料のCPUリソースを享受できますが、スクリプトを書く場合、これらのプロジェクトが提供する無料のCPUリソースを楽しむ方法CPUリソースについてはもちろん、WEBページのjavascriptコードでプロジェクトパーティと同じことをしなければなりません。一般的に言えば、トランザクションのアクションに [boost.wax] [noop] などの no-op を追加した後、トランザクションを [packed_trx] にパッケージ化してプロジェクト パーティのサーバーに送信し、サーバートランザクションに署名し、最後に署名をまとめて WAX ネットワークに送信します。

たとえば、アトミック マーケットは署名のためにhttps://wax-mainnet-signer.api.atomichub.io/v1/signに送信されます。

【ホスティングアカウント】と【ホワイトCPU】の自動化についてはここでは詳しく触れませんので、また別の機会に記事を書きます。

原理

[eosapi] の内部原理は複雑ではありません. 実際、[eospy] であろうと [pyeoskit] であろうと、内部で行うことは非常に単純です。json 形式のトランザクション コンテンツをバイナリ形式にシリアル化し、秘密鍵で署名し、HTTP 要求を送信し、eosio rpc エンドポイントに送信するだけです。

eosio rpc ドキュメントはこちら:
https://developers.eos.io/manuals/eos/latest/nodeos/plugins/chain_api_plugin/api-reference/index

各 api がどのように http リクエストを送信するか、リクエストの内容と形式は何か、ドキュメントは明確に書かれている、[eosapi] [eospy] [pyeoskit] はすべて [requests] パッケージを使用して HTTP リクエストを送信します。

署名部分については、実は [eosapi] [eospy] [pyeoskit] は作者自身が実装したものではなく、[eosapi] [eospy] などの他のサードパーティ ライブラリを通じて実装されています。

【クリプト】:https://github.com/primal100/pybitcointools

署名する。これは一般的なアルゴリズムであり、EOSIO ネットワークに限定されません。実際、[cryptos] は BTC 用に設計されています。ほとんどのパブリック チェーンには共通点があります。署名と暗号化は、基本的に SHA-256 アルゴリズムを使用するため、汎用的です。

[eosapi] での実装のこの部分は、
最初に [ueosio] を読んで学習することです: https://github.com/EOSArgentina/ueosio
次に、独自のコード スタイルを使用して再構築します、プロジェクトの作者に感謝

機能計画

[eosapi] は高レベルのクラス ライブラリとして位置付けられているため、この目標に向かって引き続き前進し、一般的に使用されるいくつかのスマート コントラクト関数を [eosapi] にカプセル化します。

誓約、送金、アカウント作成、RAM 購入、投票、NFT 送金、承認、キー変更などの機能は [eosapi] に統合され、最終的には api.stake() の呼び出しなどの関数を呼び出すだけで済みます。および api.unstake() を使用してプレッジとアンステークを実現します。たとえば、api.transfer() を呼び出して譲渡を実現します。

業績計画

[eosapi] 現時点では abi ファイルからデータをシリアル化することはできませんが、次にこの機能を実装し、これら一般的なスマート コントラクトの [eosio.token] abi ファイルに組み込みます。スマート コントラクトでは、トランザクションの送信に必要な HTTP リクエストの数をさらに減らし、rpc エンドポイント リクエストへのプレッシャーを軽減する abi キャッシュ機能を実装します。自動化されたロボットにとって、トランザクション開始の適時性を改善することは非常に重要です. HTTP リクエストを 1 つ減らすと、数十ミリ秒または数百ミリ秒も節約できます.

交換ディスカッション

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/CharlesSimonyi/article/details/125076661