NEM パブリックとプライベート間のアトミッククロスチェーン交換

クロスチェーンスワップ は、間に第三者の処理が入ることなく、異なるブロックチェーン間でのトークン交換を可能にします。

トークンの交換はアトミックに成功します。当事者の誰かが同意しなかった場合、決定された時間の経過後、彼ら各々はロックされたトークンを受信します。

NEM トークンについて語るときは、本当によく モザイク を参照します。Catapult は シークレットロック / シークレット証明トランザクション を通じてアトミックスワップを可能にします。

背景

Alice と Bob は 10 alice:tokens を 10 bob:tokens に交換したいと思っています。課題は彼らが同じブロックチェーン上に存在していないことです: alice:token は NEM のパブリックチェーン上に、一方で bob:token は catapult テクノロジーによるプライベートネットワーク上に定義されています。

注釈

NEM のプライベートと将来のパブリックチェーンは SDK を共有しています。 シークレットロック/プルーフメカニズム が許可されているなら、別のテクノロジーによるブロックチェーン間でもアトミックスワップを実装できるでしょう。

非アトミックな解決方法の場合:

  1. Alice が 10 alice:tokens を Bob へ送信する (プライベートチェーン)
  2. Bob はトランザクションを受信する
  3. Bob が 10 bob:tokens を Alice へ送信する (パブリックチェーン)
  4. Alice はトランザクションを受信する

しかし、彼らはお互いをそれほどお互いを信頼しあっていません。Bob は彼のモザイクを Alice に送ることを決めました。このガイドに従って、テクノロジーを信頼することで、この交換を成立させる方法を確認してください。

前提条件

それではコードを見ていきましょう

あるブロックチェーンから他のブロックチェーンへトークンを直接交換することは不可能で、それらのテクノロジー的な違いによるものです。

NEM パブリックおよびプライベートチェーンの場合、同じモザイク名でも異なる定義と配布されていることも、存在しないこともあります。Bitcoin と NEM の違いは、各ブロックチェーンがまったく異なるテクノロジーを使用しているためです。

異なるチェーン間でトークンを転送する代わりに、各チェーン内で取引が行われます。シークレット証明/シークレットロックメカニズムは、トークン交換がアトミックに行われることを保証します。

../../_images/cross-chain-swap1.png

パブリックとプライベート間のアトミッククロスチェイン交換

そのため、関係する各当事者は、各ブロックチェーンに少なくとも1つのアカウントを持つ必要があります。

const alicePublicChainAccount = Account.createFromPrivateKey('', NetworkType.MAIN_NET);
const alicePrivateChainAccount = Account.createFromPrivateKey('', NetworkType.MIJIN);

const bobPublicChainAccount = Account.createFromPrivateKey('', NetworkType.MAIN_NET);
const bobPrivateChainAccount = Account.createFromPrivateKey('', NetworkType.MIJIN);

const privateChainTransactionHttp = new TransactionHttp('http://localhost:3000');
const publicChainTransactionHttp = new TransactionHttp('http://localhost:3000');
  1. Alice は proof と呼ばれるランダムな数字を選び出します。Sha3-256 アルゴリズムをそれに適用して secret を得ます。
const random = crypto.randomBytes(10);
const proof = random.toString('hex');
const hash = sha3_256.create();
const secret = hash.update(random).hex().toUpperCase();
  1. Alice は、これらを含めたシークレットロックトランザクションを作成します:
  • 送信するモザイクと総量: 10 [520597229,83226871] (alice tokens)
  • 受信アドレス: プライベートチェーン上の Bob のアドレス
  • シークレット: ハッシュ化された証明
  • 資産がアンロックされるまでの時間: 96時間
  • ネットワーク: プライベートチェーン
const tx1 = SecretLockTransaction.create(
    Deadline.create(),
    new Mosaic(new MosaicId([520597229,83226871]), UInt64.fromUint(10)),
    UInt64.fromUint(96*3600/15), // assuming one block every 15 seconds
    HashType.Op_Sha3_256,
    secret,
    bobPrivateChainAccount.address,
    NetworkType.MIJIN);

一度アナウンスされると、誰かがシークレットにマッチする証明を発見するまで、このトランザクションはロックされたままです。一定の期間が経過してもそれが証明されなければ、ロックされた資金は Alice に返還されます。

  1. Alice は TX1 に署名して、プライベートチェーンへアナウンスします。
const tx1Signed = alicePrivateChainAccount.sign(tx1);
privateChainTransactionHttp
    .announce(tx1Signed)
    .subscribe(x => console.log(x),err => console.error(err));
  1. Alice は Bob にシークレットを伝えることができます。彼もまた、直接チェーンからそれを取得することもできます。
  2. Bob は、これらを含めたシークレットロックトランザクション TX2 を作成します:
  • モザイクと送信する総量: 10 [2061634929,1373884888] (bob token)
  • 受信アドレス: パブリックチェーン上の Alice のアドレス
  • 資産をアンロックするために必要なシークレット
  • 資産がロックされる時間: 84時間
  • ネットワーク: パブリックチェーン
const tx2 = SecretLockTransaction.create(
    Deadline.create(),
    new Mosaic(new MosaicId([2061634929,1373884888]), UInt64.fromUint(10)),
    UInt64.fromUint(84*3600/15), // assuming one block every 15 seconds
    HashType.Op_Sha3_256,
    secret,
    alicePublicChainAccount.address,
    NetworkType.MAIN_NET);

注釈

資産をアンロックできる時間は、TX1 のタイムフレームよりも短くする必要があります。Alice はシークレットを知っていて、Bob はそれを確信しているので、Alice がシークレットを公開したあとに、彼にはいくらかの時間があるでしょう。

  1. 署名したら、Bob は TX2 をパブリックチェーンへアナウンスします。
const tx2Signed = bobPublicChainAccount.sign(tx2);
publicChainTransactionHttp
    .announce(tx2Signed)
    .subscribe(x => console.log(x), err => console.error(err));
  1. Alice はパブリックネットワークで、シークレット証明トランザクション TX3 をアナウンスできます。このトランザクションは使用している暗号化アルゴリズム、オリジナルの証明とシークレットを定義します。これは TX2 トランザクションをアンロックします。
const tx3 = SecretProofTransaction.create(
    Deadline.create(),
    HashType.Op_Sha3_256,
    secret,
    proof,
    NetworkType.MAIN_NET);

const tx3Signed = alicePublicChainAccount.sign(tx3);
publicChainTransactionHttp
    .announce(tx3Signed)
    .subscribe(x => console.log(x), err => console.error(err));
  1. 証明はパブリックチェーン上で明らかになります。Bob も同じように、シークレット証明トランザクション TX4 をプライベートチェーンにアナウンスします。
const tx4 = SecretProofTransaction.create(
    Deadline.create(),
    HashType.Op_Sha3_256,
    secret,
    proof,
    NetworkType.MIJIN);

const tx4Signed = bobPrivateChainAccount.sign(tx4);
privateChainTransactionHttp
    .announce(tx4Signed)
    .subscribe(x => console.log(x), err => console.error(err));

Bob が TX1 資産をアンロックすると、一瞬で、アトミッククロスチェーン交換は完結します。

これはアトミックですか?

以下のシナリオを考慮してください:

  1. Bob は Tx2 をアナウンスしたくありません。Alice は94時間後に彼の資産の返還を受信します。
  2. Alice は Tx3 に署名することでトークンを交換したくありません。Bob は84時間後に彼の資産の返還を受取ります。Alice は同様に、94時間後に彼女の資産をアンロックします。
  3. Alice は Tx3 に署名しアナウンスし、Bob の資産を受取ります。Bob は Tx1 の正当性が Tx2 よりも長いため、Tx4 に署名する時間があります。

このプロセスはアトミックですが、デッドラインを迎える前に、完了するまで多くの時間がかかることになります。