カラードコインを色々調べていて、CoinSparkがなかなかやると聞いて、まずはメッセージングのプロトコルであるCoinSpark Messagesをお試しで訳してみる。

CoinSpark Messages Introduction

CoinSparkメッセージはbitcoinトランザクションを、注釈や契約、請求書、マルチメディアコンテンツ(画像やビデオなど)などの付加的なコンテンツにより豊かなものにします。メッセージはメッセージ配送サーバを介して送信者から受信者に送られるとともに、その存在はbitcoinトランザクションのOP_RETURNに追加されたいくつかのメッセージメタデータにより示されます。このメタデータには、配信サーバのアドレス(メッセージが指し示すアウトプットインデックスのリスト)とメッセージの全内容のハッシュを含みます。

ConinSparkメッセージスクリプトで通常のBitcoin Coreクライアントを介して、CoinSparkメッセージの送受信を試して見ましょう。

CoinSparkメッセージはコンテンツの一つあるいは複数の断片(one or more pieces of content)として定義され、それぞれ以下の情報を含みます:

  • コンテンツ断片のMIMEタイプ。テキストであれば text/plain となります。
  • UTF-8エンコードされたコンテンツ断片のファイル名(省略可能)
  • コンテンツ自身。テキストやHTMLはUTF-8エンコードする必要があります。

通常のbitcoinトランザクションと同様、CoinSparkアセットを誰かから他の誰かに送付するトランザクションにCoinSparkメッセージを付加することができます。アセット送付メタデータメッセージメタデータはどちらも高効率のエンコード方法を使うことで一つのOP_RETURNにまとめることが可能となっていて、メッセージハッシュも可変長とすることができます(ただし下限あり)。

メッセージハッシュはメッセージペイロード(もしくは乱数によるソルト)から計算され、次の2つの役割を果たします。

第一に、メッセージ送信者がbitcoinトランザクションの中にハッシュを埋め込むことで、受信者によるペイロードの検証が可能となるため、送信中にメッセージが改変されていないという確証を受信者に与えられます。第二に、コンテンツがbitcoinのブロックチェーン上にあることを自動的に証明できるため、送受信者双方にとって付加されていたメッセージのパブリックで検証可能な証拠となります。これはトランザクションが商業的価値を持っている場合や、トランザクションに付加された情報が請求や契約、ある種のデジタルコンテンツの配信を含む場合に有用です。こうした用途にハッシュを使えるようにするために、CoinSparkメッセージの送受信者双方のワレットにすべてのメッセージとそのソルトの恒久的なコピーを保存しておくことを推奨します。

送信プロセスは、送信側のワレットが任意のメッセージ配送サーバに対してメッセージ生成リクエストでアクセスすることから始まります。このリクエストにはbitcoinのトランザクションID、メッセージハッシュのソルト、コンテンツペイロード、許可する受信者のbitcoin公開鍵のリスト、およびメッセージの保存期間を含みます。このリクエストを受け入れたメッセージ配送サーバは、ローカルのデータベースに与えられた全ての情報を含む新規エントリを作成します。

一般的にCoinSparkメッセージは、(bitocoinもしくはアセットの)トランザクションの一つ以上のアウトプットの受信者を対象としています。これらのアウトプットのインデックスはメッセージメタデータによって示されるため、トランザクションの全ての受信者は関連付けられたメッセージを取り出すべきか否かを判断できます。メッセージを入手するため、受信者はメタデータに示される配信サーバにアクセスして対象のトランザクションIDを示し、受信者のbitcoinアドレスと対応するbitcoinの秘密鍵で署名した[メッセージ取得リクエスト]を提示します。配送サーバは提供されているリストに基づいて公開鍵をチェックし、リクエスト上の署名がこれらの公開鍵に適合することを確認します。もしそれが確認できれば、配送サーバはメッセージ情報の全体をレスポンスで送り返します。

CoinSparkは、パブリックメッセージ(興味をもつ者に対してコンテンツをブロードキャストする際に利用できる)も作成でき、bitcoinのブロックチェーン上のメッセージハッシュを使ったブロードキャストコンテンツの認証(authenticating)と公証(notarizing)1を同時に実現します。送信側のワレット2は、コンテンツを配送サーバにアップロードしたり、メッセージメタデータに適切なフラグを埋め込んだりした際に、メッセージがパブリックであることを示します。bitcoinのブロックチェーンを監視している全ての人やプロセスはbitcoinアドレスや取得リクエストへの署名無しに配送サーバから(パブリック)メッセージを取得する事ができます。リクエストの数の増加が見込まれるため、パブリックメッセージの受け入れや取得できる回数の制限の決定はそれぞれの配信サーバ次第である。

始め易くするため、無料のメッセージ配信サーバをmsg1|2|3.coinspark.orgで提供しています。しかし注意すべき点は、コンテンツを第三者から守ろうとしても、メッセージ配信サーバはあなたが送ったメッセージのコンテンツを見ることができるということです。(受信者のためにそのbitcoin公開鍵を使ってメッセージのコンテンツを暗号化することは、通常のbitcoinアドレスが鍵の唯一のハッシュであるため不可能3である。)もし、メッセージがセンシティブな情報を含んでいる(もしくは他のユーザの代わりにワレットサービスを運営している)場合、自身のシステム上で我々が提供するオープンソースの配信サーバを立ち上げるか、自分自身でそれを実装すべきです。

1. 認証(authenticating)と公証(notarizing)の違いがよくわからない。ここに書かれているようなことだとは思うが…。具体例がないとわからんなあ。
2. The sending wallet denotes that a message is public ... の訳がかなり自信ない。Theが付いているので、ワレットを送ること ではなさそうなので、 送信側のワレット と訳していいと思うけど、そうすると意味がよくわからなくなる。
3. bitcoinアドレスは (秘密)鍵の唯一のハッシュ ではないはずだし、それが暗号化できないことの理由にはならないと思う。ここでは何を言いたいのだろう?

脱線

CoinSparkはメッセージを送ったという事実だけを記録し、その内容は配信サーバに保存する。 アセットの送付とメッセージの送付をうまいことOP_RETURNにまとめているみたいだけど、その辺をどうやっているのかが気になる。