ブロックチェーンアプリケーション開発

鎖のコード例:公証人情報

簡単な紹介

chaincode_example01.go  以下の主な機能を実現します:

  • キー値に格納された初期化情報。
  • キーが読み込まれ、変更できます。

コードは、最初に初期化する  hello_world バリューチェーンを、パラメータに応じて変更されたクエリ要求作成  key 単純なキーデータベースが天然に修飾することができる達成するために、値。

主な機能

  • read:キー読み取り  args[0] 値のを。
  • write:キーを作成または変更  args[0] 値のを。
  • init:初期化キー  hello_world 値の。
  • invoke:送信パラメータは、コールの実行のタイプに対応  init し、  write 機能します。
  • query:コール  read 機能クエリ  args[0] 値について。

実行するコードの分析

main 入力プログラムの機能として、関数はシムパックの開始を呼び出して、入口chaincodeノードは、ブートプログラムを起動します。エラーが返された場合。

func main() {
    err := shim.Start(new(SimpleChaincode))
    if err != nil {
        fmt.Printf("Error starting Simple chaincode: %s", err)
    }
}

ときにブロック鎖上のスマート導入契約が残り、APIを介して相互作用することができます。

3つの主な機能は  initinvokequery三つの機能で  元帳アクセスに格納されたキーと値のペア。stub.PutStatestub.GetState

インテリジェントな契約を通じてREST APIの操作

pbftクラスタをログに記録、ジム・アイデンティティを仮定chaincodeのJSONリクエスト形式の展開を要求します。

{
    "jsonrpc": "2.0",
    "method": "deploy",
    "params": {
        "type": 1,
        "chaincodeID": {
            "path": "https://github.com/ibm-blockchain/learn-chaincode/finished"
        },
        "ctorMsg": {
            "function": "init",
            "args": [
                "hi there"
            ]
        },
        "secureContext": "jim"
    },
    "id": 1
}

現在、唯一の関数としてgithubの、ctorMsg上のディレクトリパスをサポートしている  init パラメータの受け渡し。

JSON形式の呼び出しは、関数を呼び出します:

{
    "jsonrpc": "2.0",
    "method": "invoke",
    "params": {
        "type": 1,
        "chaincodeID": {
            "name": "4251b5512bad70bcd0947809b163bbc8398924b29d4a37554f2dc2b033617c19cc0611365eb4322cf309b9a5a78a5dba8a5a09baa110ed2d8aeee186c6e94431"
        },
        "ctorMsg": {
            "function": "init",
            "args": [
                "swb"
            ]
        },
        "secureContext": "jim"
    },
    "id": 2
}

ここで名前のフィールドがある  deploy 見返りにメッセージの文字列フィールド。

query インタフェースも同様です。

チェーンコード例2:トレーディング資産

簡単な紹介

chaincode_example02.go  以下の主な機能を実現します:

  • 初期設定A、Bの2つのアカウント、及び資産アカウントの2つの初期値を割り当てます。
  • A、Bの2つのアカウント間の資産の取引。
  • クエリは、アカウントに、B 2バランスされているトランザクションが成功したことを確認します。
  • アカウントを削除します。

主な機能

  • init:初期化A、Bの2つのアカウント。
  • invoke:アカウント間のA、B転送を実施します。
  • query:クエリA、アカウント上のBのバランス;
  • delete:アカウントを削除します。

依存しているパッケージ

import (
    "errors"
    "fmt"
    "strconv"

    "github.com/hyperledger/fabric/core/chaincode/shim"
)

strconv そして、文字列のint型の間の変換。

機能呼び出しでは、があります。

X, err = strconv.Atoi(args[2])
    Aval = Aval - X
    Bval = Bval + X

場合は  args[2]<0 、時間、口座残高の増加、減少またはBの口座残高。

スケーラブルな機能

新規アカウントの例とは、初期化関数に含まれていません。開発者は、彼らのビジネスモデルに応じて追加することができます。

通貨管理の図

簡単な紹介

シンプルなビジネスケースデジタル通貨の発行や転送を実現するインテリジェントな契約。中央銀行、商業銀行、法人:この合計のうち3つの役割に分かれています。これは中央銀行が一定の金額を発行することができ、それが企業間の相互転送することができます。メインには、以下の機能を実現します:

  • 初期の中央銀行との通貨の数
  • 新商業銀行、中央銀行は自国通貨の固定数を発行する一方、
  • 新規事業
  • 商業銀行が企業にデジタル通貨の一定量を転送しました
  • 企業間の相互転送
  • 企業、銀行、取引情報を照会

主な機能

  • init:中央銀行を初期化し、一定の金額を出します。
  • invoke:内部の契約を呼び出します。
  • query:その他の関連情報。
  • createBank:新商業銀行、中央銀行は自国通貨の数を発行しながら、
  • createCompany:新事業;
  • issueCoin:中央銀行は再び(トランザクションに起因する)一定の金額を公表しました。
  • issueCoinToBank中央銀行は、商業銀行にディジタル通貨(帰属する取引)の一定量を移します。
  • issueCoinToCp:商業銀行は企業(取引に起因する)にデジタル通貨の一定量を転送します。
  • transfer(取引に起因する)、企業間で行われる相互転送します。
  • getCompanys:数が10社の企業よりも大きい場合、最初の10にアクセスするために、すべての会社情報を取得します。
  • getBanks:最初の訪問10、数が10以上である場合には前に、すべての情報の商業銀行、商業銀行を取得
  • getTransactions:トランザクションの数が10、最初の訪問よりも大きい場合、10の前にすべてのトランザクションを取得します。
  • getCompanyById:同社は、情報を取得し、
  • getBankById:銀行の情報を取得します。
  • getTransactionBy:レコード契約を取得します。
  • writeCenterBank:中央銀行情報を変更します。
  • writeBank:商業銀行を変更します。
  • writeCompany:企業情報を変更します。
  • writeTransaction:トランザクション情報を書き込みます。

データ構造の設計

  • centerBank中央銀行
    • 名前:名前
    • TOTALNUMBER:発行された通貨の総量
    • RestNumber:アカウントのバランス
    • ID:IDは0に固定されています
  • 銀行の商業銀行
    • 名前:名前
    • TOTALNUMBER:受け取ったお金の総額
    • RestNumber:アカウントのバランス
    • ID:銀行ID
  • 会社の仕事
    • 名前:名前
    • 番号:アカウントのバランス
    • ID:企業ID
  • トランザクション取引内容
    • FromType:送信者の役割// centerBank:0、バンク:1、会社:2
    • FromID:送信者ID
    • ToType:受信者の役割//銀行:1、会社:2
    • TOID:受信者ID
    • 時間:取引時間
    • 番号:取引の額
    • ID:トランザクションID

インターフェイスデザイン

init

リクエストパラメータ:

args[0] 银行名称
args[1] 初始化发布金额

応答パラメータ:

{"Name":"XXX","TotalNumber":"0","RestNumber":"0","ID":"XX"}

createBank

リクエストパラメータ:

args[0] 银行名称

応答パラメータ:

{"Name":"XXX","TotalNumber":"0","RestNumber":"0","ID":"XX"}

createCompany

リクエストパラメータ:

args[0] 公司名称

応答パラメータ:

{"Name":"XXX","Number":"0","ID":"XX"}

issueCoin

リクエストパラメータ:

args[0] 再次发行货币数额

応答パラメータ:

{"FromType":"0","FromID":"0","ToType":"0","ToID":"0","Time":"XX","Number":"XX","ID":"XX"}

issueCoinToBank

リクエストパラメータ:

args[0] 商业银行ID
args[1] 转账数额

応答パラメータ:

{"FromType":"0","FromID":"0","ToType":"1","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"}

issueCoinToCp

リクエストパラメータ:

args[0] 商业银行ID
args[1] 企业ID
args[2] 转账数额

応答パラメータ:

{"FromType":"1","FromID":"XX","ToType":"2","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"}

transfer

リクエストパラメータ:

args[0] 转账用户ID
args[1] 被转账用户ID
args[2] 转账余额

応答パラメータ:

{"FromType":"2","FromID":"XX","ToType":"2","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"}

getBanks

応答パラメータ

[{"Name":"XXX","Number":"XX","ID":"XX"},{"Name":"XXX","Number":"XX","ID":"XX"},...]

getCompanys

応答パラメータ

[{"Name":"XXX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"},{"Name":"XXX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"},...]

getTransactions

応答パラメータ

[{"FromType":"XX","FromID":"XX","ToType":"XX","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"},{"FromType":"XX","FromID":"XX","ToType":"XX","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"},...]

getCenterBank

応答パラメータ

[{"Name":"XX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"}]

getBankById

リクエストパラメータ

args[0] 商业银行ID

応答パラメータ

[{"Name":"XX","TotalNumber":"XX","RestNumber":"XX","ID":"XX"}]

getCompanyById

リクエストパラメータ

args[0] 企业ID

応答パラメータ

[{"Name":"XXX","Number":"XX","ID":"XX"}]

getTransactionById

リクエストパラメータ

args[0] 交易ID

応答パラメータ

{"FromType":"XX","FromID":"XX","ToType":"XX","ToID":"XX","Time":"XX","Number":"XX","ID":"XX"}

writeCenterBank

リクエストパラメータ

CenterBank

応答パラメータ

err  nil 为成功

writeBank

リクエストパラメータ

Bank

応答パラメータ

err  nil 为成功

writeCompany

リクエストパラメータ

Company

応答パラメータ

err  nil 为成功

writeTransaction

リクエストパラメータ

Transaction

応答パラメータ

`` `成功のためにnilをERR?

他の

クエリが読み取り速度を考慮に入れるためには、非ブロック鎖にバックアップデータベースに格納されている情報の一部にも良い選択です。

学歴

機能説明

スマート契約は、  与信管理の単純なケースを実装しています。公共条約による教育の分野での認定のために、条約は自然の安定性と中立性と、機能を改ざん外にすることはできません。

次のようにスマート契約3つの役割は以下のとおりです。

  • 学校
  • 個人的な
  • 資格に必要な認証機関や企業

学校は、個人の資格によってブロック鎖に関連する情報に基づいて付与することができ、関係機関が人の教育的背景情報を確認することができ、秘密鍵署名の使用は、実際の情報が有効であることを確認します。簡単にするために、関連するビジネスを簡素化しようとすると、他の学校の生徒は懲戒のためのドロップアウトを終了または外出を開始していなかった、学校はそれぞれの教育情報を変更することができます。

アカウントは、アナログ秘密鍵と公開鍵を使用して、本実施形態では簡単のために、ローカルにインストールされたクライアントの秘密鍵によって生成されなければなりません。

データ構造の設計

  • 学校
    • 名前
    • 場所
    • アカウントのアドレス
    • アカウント公衆
    • プライベートアカウント
    • 学校の生徒
  • 個人的な
    • フルネーム
    • アカウントのアドレス
    • 過去の学術
  • 教育情報
    • いいえ教育情報なし
    • 通学
    • 年の学校
    • 完全な学年
    • 出席状態// 0:卒業1:撤退
  • レコードを変更する(また、登録レコードの変更に対応)
    • 番号
    • 学校のアカウントのアドレス(通常はアドレスがアカウントパブリックアドレスに基づいて計算することができ、その後、確認することができます)
    • 署名の学校
    • 個人アカウントのアドレス
    • 個々のパブリックアドレス(公開鍵個人が対処する必要はありません)
    • 変更されました
    • //変更操作0:ノーマル卒業1:撤退2:エントリ

記録動作のプロパティのすべてのための学術情報の操作。

機能とそれぞれの機能実装

  • init 初期化関数
  • invoke 契約は内部関数を呼び出します

  • updateDiploma 学校の学生の学術情報、および署名によって更新(レコード情報を返します)

  • enrollStudent 学校の入学(学校の情報に戻っ)
  • createSchool 新しい学校を追加
  • createStudent 新しい学生を追加します
  • getStudentByAddress 教育学生のアカウントアドレス情報を通じて学生を訪問
  • getRecordById Idでレコードを取得
  • getRecords すべてのレコードを取得します(レコード数が10以上である場合には、以前の10に戻ります)
  • getSchoolByAddress 学校は学校のアカウントのアドレスを介して情報を取得します
  • getBackgroundById 学歴IDで保存された情報を取得します。

  • writeRecord 書かれたレコード

  • writeSchool 新しく作成された学校を書きます
  • writeStudent 学生は、新しく作成された書き込み

インターフェイスデザイン

createSchool

リクエストパラメータ:

args[0] 学校名称
args[1] 学校所在位置

応答パラメータ:

学校信息的字节数组,当创建一所新学校时,该学校学生账户地址列表为空

createStudent

リクエストパラメータ:

args[0] 学生的姓名

応答パラメータ:

学生信息的字节数组表示,刚创建过往学历信息列表为空

updateDiploma

リクエストパラメータ

args[0] 学校账户地址
args[1] 学校签名
args[2] 待修改学生的账户地址
args[3] //对该学生的学历进行怎样的修改,0:正常毕业  1:退学

応答パラメータ

返回修改记录的字节数组表示

enrollStudent

リクエストパラメータ:

args[0] 学校账户地址
args[1] 学校签名
args[2] 学生账户地址

応答パラメータ

返回修改记录的字节数组表示

getStudentByAddress

リクエストパラメータ

args[0] address

応答パラメータ

学生信息的字节数组表示

getRecordById

リクエストパラメータ

args[0] 修改记录的ID

応答パラメータ

修改记录的字节数组表示

getRecords

応答パラメータ

获取修改记录数组(如果个数大于10,返回前10个)

getSchoolByAddress

リクエストパラメータ

args[0] address

応答パラメータ

学校信息的字节数组表示

getBackgroundById

リクエストパラメータ

args[0] ID

応答パラメータ

学历信息的字节数组表示

テスト

コミュニティエネルギーシェア

機能説明

この  契約  ニューヨークで実験的なエネルギーのマイクログリッドとは、例えば、単純なケースとして実現すること。

「社長アベニュー、ソーラーパネルで5つの家族の世代の側では、5のストリートファミリーの他の側面にある電源とネットワーク接続のブロック鎖を必要としない家族間での取引、関係するほとんどの人員をある購入することができます。コミュニティエネルギーマネジメントシステムの未来を表すことができ、管理が。トランザクションを記録することができます「しかし、このアイデアは非常に有望です。"

グリッドの開発者LO3の創設者ブルックリンマイクロローレンス・オルシーニは言いました:

「我々はこの通りに興味かどうか、互いの手の中に電力の購入のために人々をテストするために、再生可能な電力市場を構築している。あなたは非常に遠くにエネルギーを生成した場合、輸送中の損失がたくさんあるでしょう、あなたはそれを得ることはありません電力値。しかし、あなたはちょうど通りを渡っている場合、あなたはエネルギーの効率的な利用できるようになります。」

マイクログリッドエネルギーの領域内のメモリは、各家庭は、生産のためだけでなく、消費者のために可能であってもよいです。いくつかの家族がソーラーパネルを持って、残量の太陽電池パネルは、電力の値として販売することができ、簡単にするために、家庭用電源ユニット1は、家庭用の電力購入のバランスに十分な電力を持つことが必要になることがあります。

アカウントは、アナログ秘密鍵と公開鍵を使用して、本実施形態では簡単のために、ローカルにインストールされたクライアントの秘密鍵によって生成されなければなりません。各ユーザの秘密鍵GUID + "1"、公開鍵GUID + "2"。プライベートキー+「1」を単純化する方法として署名

データ構造の設計

これは、スマートユーザー契約におけるすべての家庭のための唯一の役割です。

  • ホームユーザー
    • アカウントのアドレス
    • //残留エネルギーの家ソーラーパネルのいかなる部分も、0の値
    • 口座残高(電子マネー)
    • 番号
    • //ステータス0:購入、1は使用できません:買います
    • 公開キーアカウント
    • プライベートアカウント
  • トランザクション(取引が取引を認めるために、売り手と公開鍵署名の買い手の両方を持っている必要があります。公開鍵署名生成規則、公開鍵+作成するトランザクションのID番号を、このタイプのトランザクションでは、限り、十分な買い手があるとしてお金、売り手の取引は自動的に署名されます)
    • 購入者の住所
    • 出品者の住所
    • 電力販売
    • 電力取引の量
    • 番号
    • 取引時間

機能とそれぞれの機能実装

  • init 初期化
  • invoke 契約は内部関数を呼び出します
  • query その他の関連情報
  • createUser 新しいユーザーを作成し、エネルギーマイクロメッシュの呼び出しに追加
  • buyByAddress 一人のユーザーを呼び出すために、電力の一定量を購入します
  • getTransactionById IDによる買収取引のコンテンツクエリ
  • getTransactions 買収取引クエリ(トランザクションは最初の10を得るための10の数よりも大きい場合)
  • getHomes (ユーザ数が10より大きい場合、最初の10入手、)クエリをユーザが取得します
  • getHomeByAddress アドレスによるユーザのクエリを取得
  • changeStatus ユーザのビットは、その状態の呼び出しを修正します

  • writeUser 新規ユーザーは、鍵のペアに書き込まれます

  • writeTransaction 録音

    インターフェイスデザイン

    createUser

リクエストパラメータ:

args[0] 剩余能量值 
args[1] 剩余金额

応答パラメータ:

新建家庭用户的json表示

buyByAddress

リクエストパラメータ:

args[0] 卖家的账户地址
args[1] 买家签名
args[2] 买家的账户地址
args[3] 想要购买的电量数值

応答パラメータ:

购买成功的话返回该transaction的json串。
购买失败返回error

getTransactionById

リクエストパラメータ:

args[0] 交易编号

応答パラメータ:

查询结果的transaction 交易表示

getTransactions

リクエストパラメータ:

none

応答パラメータ:

获取所有的交易列表(如果交易大于10,则返回前10个)

getHomeByAddress

リクエストパラメータ

args[0] address

応答パラメータ

用户信息的json表示

getHomes

応答パラメータ

获取所有的用户列表(如果用户个数大于10,则返回前10个)

changeStatus

リクエストパラメータ:

args[0] 账户地址
args[1] 账户签名
args[2] 对自己的账户进行的操作,0:设置为不可购买  1:设置状态为可购买

応答パラメータ:

修改后的用户信息json表示

テスト

 

おすすめ

転載: blog.csdn.net/shangsongwww/article/details/90298614
おすすめ