1はじめに
ミナのアカウントのフィールドは次のとおりです。
- 1)public_key:アカウントの圧縮された公開鍵。
- 2)token_id:
- 3)token_permission:Token_permissions.default
- 4)token_symbol:
- 5)量:つまり、バランス。
- 6)nonce:nonce値はトランザクションによって増分されます
- 7)receipt_chain_hash:
- 8)委任:委任されたアカウントの圧縮された公開鍵。
- 9)voting_for:どのstate_hashに投票するか
- 10)タイミング:タイミング。時間制限なし。
- 11)permission:Permissions.user_default
- 12)zkapp:Zkapp_accountの場合
- 13)zkapp_uri:文字列。
{ public_key
; token_id
; token_permissions
; token_symbol
; balance
; nonce
; receipt_chain_hash
; delegate
; voting_for
; timing
; permissions
; zkapp
; zkapp_uri
}
(* Zkapp_account结构体为: *)
type ('app_state, 'vk, 'zkapp_version, 'field, 'slot, 'bool) t =
{ app_state : 'app_state
; verification_key : 'vk
; zkapp_version : 'zkapp_version
; sequence_state : 'field Pickles_types.Vector.Vector_5.Stable.V1.t
; last_sequence_slot : 'slot
; proved_state : 'bool
}
(* Permission.user_default为: *)
let user_default : t =
{ edit_state = Signature
; send = Signature
; receive = None
; set_delegate = Signature
; set_permissions = Signature
; set_verification_key = Signature
; set_zkapp_uri = Signature
; edit_sequence_state = Signature
; set_token_symbol = Signature
; increment_nonce = Signature
; set_voting_for = Signature
}
2.MinaアカウントのReceive_chain_hash
アカウントにreceipt_chain_hash
フィールドを導入する動機は次のとおりです。
- ミナは簡潔なブロックチェーンであり、その状態は一定時間として検証されます。定数時間ルックアップの実装により、履歴トランザクションレコードは保持されません。
場合によっては、トランザクションがブロックチェーンに入ったことをクライアントに証明させると役立つことがあります。これは、クライアントが受信者に多額のお金を送ったことを証明したい場合に特に便利です。
receipt_chain_hash
このアカウントに送信されたすべてのトランザクションの証明書。アカウントがトランザクションtn⋯t1t_n\cdotst_1を送信したとします。tn⋯t1、pn⋯p1 p_n \ cdots p_1pn⋯p1はこれらのトランザクションのペイロードハッシュであり、次にそのreceipt_chain_hash
rn r_nrn是:
rn = H(pn、H(pn − 1、⋯))= H(pn、rn − 1)r_n = H(p_n、H(p_ {n-1}、\ cdots))= H(p_n、 r_ {n-1})rn=H (pn、H (pn −1 _、⋯)))=H (pn、rn −1 _)
ここでHHHはハッシュ関数です。
初期状態、r 0 = r_0 =r0=Receipt.Chain_hash.empty
空のハッシュをreceipt_chain_hash
ます。【letempty=of_hash Random_oracle。(salt“ CodaReceiptEmpty” |>ダイジェスト)]
クライアントがrkを保存する場合⋯rnr_k\cdots r_nrk⋯rn、トランザクションtkt_kを送信したことを証明できますtk。どのベリファイアもチェーンの現在の状態を照会できるため、チェックreceipt_chain_hash
はrnr_nと等しくなります。rn、次に、 ri = H(ti、ri − 1)r_i = H(t_i、r_ {i-1})であることを再帰的に検証します。r私は=H (t私は、ri −1 _) i=2からi=kまでi=2までi=kまで私=2はi_まで開始します=kまで。
つまり、クライアントはすべてのトランザクションとレシートチェーンのハッシュ値を保存する必要があります。クライアントがMinaネットワークから切断されると、これらのデータも保存する必要があります。同時に、クライアントはこれらのトランザクションとレシートチェーンハッシュ値に従ってチェーンの現在の状態を簡単に取得する必要があります-キー値データベースを介して簡単に取得でき、キーはレシートチェーンハッシュ値であり、値には次のフィールドがあります。
type value = Root | Child of {parent: receipt_chain_hash; value: transaction}
証明手順は、[(t 1、r 1)、⋯、(tk、rk)] [(t_1、r_1)、\ cdots、(t_k、r_k)]のマークルリストを提供します。[ (t1、r1)、⋯、(tk、rk)],其中 r i = H ( t i , r i − 1 ) r_i=H(t_i,r_{i-1}) r私は=H (t私は、ri −1 _) fori=2⋯ki=2\ cdots k私=2⋯k。
この設計の欠陥は次のとおりです。
- 1)トランザクションを送信したことを証明するために、クライアントは送信したすべてのトランザクションを記録する必要があります。複数のトランザクションを送信するユーザーには適していません。そして、証明の複雑さはO(n)O(n)です。O (n )、nnnは送信されたトランザクションの数です。
- 2)ピアが同じマシンを介してトランザクションを送信すると想定されています。ノードが複数のマシンでトランザクションを送信する場合、これらのマシンを同期して、送信するトランザクションを共有できます。
ユーザーがこの同期を実現するための最も簡単なソリューションは、データをクラウドデータベースに保存することです。ユーザーは、データをキャッシュ形式でローカルに保存することもできます。
参考文献
[1]ミナrfcs0006-receipt-chain-proving.md
付録1.ミナブログシリーズ
ミナシリーズのブログには次のものが含まれます。