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

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

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

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

背景

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

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

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

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

前提条件

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

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

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

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

../../_images/cross-chain-swap-cycle1.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');

const publicChainGenerationHash = process.env.NETWORK_GENERATION_HASH as string;
const privateChainGenerationHash = process.env.NETWORK_GENERATION_HASH as string;
  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 は、これらを含めたシークレットロックトランザクション TX1 を作成します:
  • Mosaic: 10 10 [520597229,83226871]` alice token
  • 受信者: Bob のアドレス (プライベートチェーン )
  • Algorithm: SHA3-256
  • Secret: SHA3-256(proof)
  • 期間: 96h
  • ネットワーク: プライベートチェーン
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, privateChainGenerationHash);
privateChainTransactionHttp
    .announce(tx1Signed)
    .subscribe(x => console.log(x), err => console.error(err));
  1. Alice は Bob にシークレットを伝えることができます。彼もまた、直接チェーンからそれを取得することもできます。
  2. Bob は、これらを含めたシークレットロックトランザクション TX2 を作成します:
  • Mosaic: 10 [2061634929,1373884888] bob token
  • 受信者: Alice のアドレス (パブリックチェーン )
  • Algorithm: SHA3-256
  • Secret: SHA3-256(proof)
  • 期間: 84h
  • ネットワーク: パブリックチェーン
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, publicChainGenerationHash);
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,
    alicePublicChainAccount.address,
    proof,
    NetworkType.MAIN_NET);

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

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

Bob は TX1 の資産を受信し、アトミッククロスチェーン交換は完結します。

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

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

✅ Bob は TX2 をアナウンスしたくありません: Alice は 94 時間後に彼の資産の返還を受信します。

✅ Alice は TX3 に署名することでトークンを交換したくありません: Bob は 84 時間後に彼の資産の返還を受取ります。Alice は同様に 94 時間後に彼女の資産をアンロックします。

⚠️ Alice は TX3 に署名しアナウンスし Bob の資産を受取ります: Bob は TX1 の正当性が TX2 よりも長いため TX4 に署名する時間があります。

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