アセット仕様

Assetsspecification.mdの日本語訳です

*10/10に更新がありました、現在この日本語訳は更新前のものです。用意でき次第、更新を反映させる予定です。

#目標

Wavesアセットは技術的なスケーラビリティ向上とユーザビリティ、そしてビジネスで使用する際の汎用性を備えています。

コア機能のスケーラブルな利活用のために、証明済みデータ構造を基盤とする認証処理の簡易化を行っています。Wavesのような帳簿のトークン残高は、ブロックチェーン履歴を使用するネットワークノードによって確立されます。このようにしてストレージの肥大化、スケーラビリティ、処理性能の問題に対処します。

ほとんどのアセットのトランザクションボリュームはそれほど大きなものではなく、活発に使用されるアセットは限られています。このような場合にはSPVライトクライアント認証のコンセプトに沿った、ボリュームの大きなアセットの状態のみを保持し、簡易な証明で更新を行う方法が理にかなっています。

ライトクライアントは、一時的な状態データでさえ保存することなくアセットトランザクションを認証することが可能です。そのためには、アセットの先行する状態データのルートハッシュ、最新ブロックのルートハッシュ、トランザクションの証明、これらを使用した最新ブロックのトランザクション認証機能が必要です。

このステート・ストレージ・リダクションは、ブロックチェーンに追加情報を配置することで達成できます。すなわち、対象アセットの状態データのための証明済みデータ構造のルートハッシュ、および、対象アドレスのアセット残高の暗号的証明です。これに伴うブロックサイズの増大は、コンパクトなデータ構造を使用することで管理可能です。

#API

##アセットの作成、削除、転送操作

###アセットの作成

Issue (AsssetName, Description, Quantity, Decimals, Reissuable, AssetID, Fee)
AssetName:String[4–16] — アセット名。一意に制限されるものではなく重複できる。
Description:String[0–1000] — アセットに関する説明文
Quantity:Long — アセットの総発行数。小数部も計算に入れる必要がある。全てを整数として扱うためにAPIではQuantityを小数部の桁数と掛け合わせて使用する。
Reissuable:Boolean — 後でアセットを追加発行できるか、できないかを指定するフラグ
AssetID:Array[Byte] — Reissuableが真であるアセットを追加発行する際に使用する初回発行時のtxid
Decimals:Byte[0–8] — 小数部の桁数
Fee:Int — wavelets単位で指定する手数料

アセット発行時には、対応するデータ構造のルートハッシュと、スキップリストの葉に書き込まれたノード残高が共にブロックに書き込まれます。
追加発行可能なアセットの場合には発行者のアドレスもスキップリストに保存する必要があります。アセット発行者のみが追加発行できるように、発行者のアドレスを追加発行時のトランザクション認証に使用します。追加発行トランザクション時に、Reissuableフラグを変更することが可能です。

アセットの発行トランザクションがブロックに保存された後には、発行時のトランザクションIDをAssetIDとして使用できます。すべてのノードが、すべてのアセットのルートハッシュを保存するので、それはつまり、すべてのアセットのAssetIDを保存することになります。

###アセットの転送

Send (Sequence(AssetID, SenderAddress, ReceiverAddress, Amount), Sequence(Signature))
AssetID:Array[Byte] — アセットの作成トランザクションのtxid
Sender Address:Waves address — アセットの送信元ウォレットアドレス
Receiver Address:空白可[Waves address] — アセットの送信先ウォレットアドレス。このアドレスが空の場合は、ブロック生成者へ支払う手数料であることを表す。
Amount:Long — 送信するアセットの数量
Signature:Array[Byte] — トランザクションの暗号的証明

トランザクションAPIは、証明やルートハッシュを持たず、したがって、ライトクライアントおよびAPIクライアントは、必要な計算をフルノードに委任することになります。

複数のアカウントから、複数のアカウントへ、複数のアセットを、1つのトランザクションでまとめて送信することが可能です。Sendトランザクションは、送信に使用するすべての送信元アドレスの署名を必要とします。この汎用化されたトランザクションは、ネットワークトークン(WAVE)の送信でも同じく使用します。ネットワークトークンを送信する場合は、AssetIDに0を入力します。

1つのトランザクションにまとめることのできる、異なるトークンの数は、スパム攻撃を考慮して制限を加える必要があります。

###アセットの削除

Delete(AssetID, Amount, Fee, Signature(s))
AssetID:Array[Byte] — アセットの作成トランザクションのtxid
Amount:long — 削除するアセットの数量
Fee:Int — ブロック生成者に支払われる手数料、wavelet単位で指定
Signature:Array[Byte] — トランザクションの暗号的証明

対象のアセットを保持するアドレスは、保持するアセットの一部、またはすべてを削除することができます。アセットの状態データとスキップリストは、Deleteトランザクションに従って再計算されます。

##アセット・エクスチェンジ・オペレーション

アセットの有用性を高めるためには、異なるアセットを相互に取引できる必要があります。あわせてブロックチェイン・セトルメントによって取引手続きを改善することも重要です。

WAVESは、ブロックチェーンに不必要なデータを配置しないアプローチを取ります。ブロックチェーンを注文マッチングではなく、セトルメントに使用します。注文マッチングは、セントラライズドノードのマッチングサービスで実行されます。注文が成立した後には、マッチングサービスが交換トランザクションを作成し、取引当事者双方に送信し署名をもらいます。

###取引注文の発注

Order (SpendAddress, SpendTokenID, ReceiveTokenID, price, amount, Signature)
SpendAddress:Waves address — 注文送信者アドレス。WAVESアドレスフォーマットに準じる。
SpendTokenID:Array[Byte] — 支払に使用するアセットのトークンID
ReceiveTokenID:Array[Byte] — 受取りたいアセットのトークンID
Price:Int — 受取りたいアセット(数量1つ当たり?)への支払に使用するアセットの数量。10⁸倍(小数部をシフト)した値を使用する
Amount:Long — 受取りたいアセットの数量
Signature:Array[Byte] — トランザクションの暗号的証明。ノードを認証するために、すべてのトランザクションには署名が必要

OrderAPIは、ブロックチェーンでファイナライズされません。注文を制御するために、OrderAPIはOrderIDを返します。OrderIDは、Orderトランザクションのハッシュより構成され、クライアントに保存されます。

###取引注文のキャンセル

Cancel (SpendAddress, OrderID, Signature)
SpendAddress:Array[Byte] — 注文送信者アドレス。WAVESアドレスフォーマットに準じる。
OrderID:Long — 注文ID
Signature:Array[Byte] — トランザクションの暗号的証明。

###取引トランザクションのファイナライズ

マッチングサービスは、注文成立を確認後、取引当事者双方に署名前のSpendトランザクションを送信します。各取引当事者による署名を得た後、マッチングサービスはトランザクションをネットワークに放流し、ブロックチェーンに記録します。

Send(((SpendTokenID, SenderAddress, ReceiverAddress, SpendTokenAmount),(ReceiveTokenID, ReceiverAddress, SenderAddress, ReceiveTokenAmount),(MatcherFeeTokenID, ReceiverAddress, MatcherAddress,MatcherFee),(NetworkFeeTokenID, SenderAddress, None, MinerFee)),(SignatureSpender, SignatureReceiver))
SpendTokenID、ReceiveTokenID、SpendAddress、ReceiveAddress — 取引を行うアカウントとアセットのトークンIDを指定
SpendTokenAmount、ReceiveTokenAmount — マッチングの成立内訳。取引当事者双方によって認証され、間違いがある場合はトランザクションに署名しないことも可能
MatcherAddress — マッチングサービスの管理するWavesアドレス。マッチングサービスは、このアドレスを指定して一定のサービス使用料を課金することができる
MatcherFee — マッチングサービスに支払う料金の金額
SignatureSpender、SignatureReceiver — 取引当事者双方の署名。

ブロックチェーン上でファイナライズを行うため、トランザクションは取引当事者双方の署名を必要とします。これらの署名はマッチングサービスにのみ開示され、取引参加者はデータを改ざんできないことから、サービス提供者にリワードを支払う企ても機能しません。

“Send”トランザクションが、ブロックチェーン・セトルメント(注文の清算)に使用されます。専用のトランザクションタイプは用意していません。取引参加者はトランザクション全体に対して署名を行うので、取引はアトミック(不可分性)であり、支払に使用するアセットを送信することなく、受取りたいアセットのみを手に入れることはできません。