EOSIO ソース コード分析 - EOSIO コントラクト開発用の json 解析ライブラリを追加

json ライブラリを追加する理由

アプリケーションを開発する際にはサーバーとの通信が欠かせませんし、EOSIO コントラクトを作成する際にもデータを転送する必要があります。EOSIOはjson_to_binメソッドを使ってデータをパッケージ化してくれますが、使いこなすのがめんどくさい. 他の言語(python, jsonなど)を使ってSDKを開発したいのですが、パッケージのフォーマットが分からないと. EOSIO取引のアクションデータ、大変ご迷惑をおかけいたします。
しかし、json をトランザクション アクションのパラメーターとして使用すると、すべての問題が解決されます. クライアントがパック文字列メソッドを実装している限り、json_to_bin API に依存せず、同時に、トランザクション内の大きなデータ オブジェクトも解決できるため、この問題を解決する目的で、EOSIO コントラクト開発ライブラリに json 解析ライブラリを追加して、コントラクト開発の難易度を下げる必要もあります。
json 解析ライブラリを追加する利点は次のとおりです。

  1. json 構文は使いやすく、幅広い互換性があるため、データ共有に最適なツールです。
  2. EOSIOのトランザクションデータのパッケージングが複雑すぎて面倒で、開発効率が高くない
  3. EOSIO コントラクト パラメータを使用して大きなデータを転送するのは不便です

増やすときに気をつけたいこと

以前の EOSIO 契約開発ライブラリの分析によると、独自の開発ライブラリを契約開発ライブラリに追加するには、次の点に注意する必要があります。

  1. コード ベースはできるだけ簡潔に記述する必要があります。そうしないと、コンパイルされたコントラクトが大きくなります。
  2. コード内にシステム操作やファイル操作などを含めることはできず、それらはすべてメモリ データ操作に関連しています。
  3. プラットフォームに応じて定義されたマクロをコードに含めることはできません。これにより、コンパイルが失敗し、コード サイズが増加する可能性があります。
  4. コード内で例外処理を行うことはできません. どうしても論理的な例外を投げる必要がある場合は, 開発ライブラリが提供するチェック機能を使って, 例外が投げられたことをアサートしてください.

使用例

EOSIO 契約開発ライブラリに直接追加できる json ライブラリは多くなく、ほとんどの場合、変更が必要です. ここでは、変更された picojson ライブラリの簡単で実用的な説明を示します. 注: picojson ライブラリには 1 つのヘッダー ファイルしかありません、および直接コピーを使用して
元の
picojson アドレスを入力できます: https://github.com/kazuho/picojson
EOSIO バージョンの picojson アドレス: https://download.csdn.net/download/whg1016/86506368
以下は説明のみです契約での使用

json 文字列を解析する

std::string json_str = "{\"a\":1}";

picojson::value v;
std::string err;
err = picojson::parse(v, json_str);

結果オブジェクトはオブジェクト v に格納され、v を使用して対応するデータを取得できます。

フィールドが存在すると判断する

check( v.contains("account"), "invalid params(account)");

フィールド アカウントが存在するかどうかを判断し、存在しない場合は、チェック アサーションを使用して例外をスローします。

値フィールドを取得

// 获取字符串
auto account = v.get("account").get<std::string>();

// 获取数值
auto balance = v.get("balance").get<int64_t>();

詳細については、引き続き picojson の開発ドキュメントを参照してください。

文字列 json シリアライゼーション

picojson::value json;		
json.set<picojson::object>(picojson::object());
json.get<picojson::object>()["from"] = picojson::value(from.to_string());
json.get<picojson::object>()["to"] = picojson::value(to.to_string());
json.get<picojson::object>()["quantity"] = picojson::value(quantity.to_string());
json.get<picojson::object>()["memo"] = picojson::value(std::string("transfer memo"));

action act( { {get_self(), name(active_permission)},{from, name(active_permission)}},
    name("eosio.token"), name("transfer"), json.serialize());
act.send(); 

要約する

  • 開発ライブラリを EOSIO に追加することは、ルールに準拠している限り、比較的簡単です。
  • picojson ライブラリの記述は簡潔ではありませんが、他の json ライブラリに比べてサイズが小さいという利点があります。

フォローアップ計画

EOSIO のソース コードを読んだ友人は、EOSIO での fc ライブラリの使用を高く評価する必要があります. その中に自己実装されたリフレクション メカニズムのセットがあります. フォロー アップ計画では、リフレクション関連のコードを fc ライブラリに移植しようとします. , これにより、契約の開発効率が大幅に向上します. ただし、結果として契約のコンパイル量も増加します.

おすすめ

転載: blog.csdn.net/whg1016/article/details/126647675