見出し画像

NFTDriveExでのトランザクション詳細

はじめに

どうもボー太郎です。
Symbolブロックチェーンを利用した、
NFTDriveEX(以下 EX)でのNFT売買取引のトランザクション詳細の解説です。
EXではチャート機能があり、オンチェーン以外のデータを全く持たないシステムですがちゃんとチャートとして履歴を表示することができます。
詳しく解説することでみんなで内容を理解できるようになると良いなと思います。

ウォレットはデータベースを持たない。

参考記事 NFTDriveEX:Symbolでの売買の標準化。

購入の説明

EXでの購入者の流れを説明します。

1.購入方法

NFTを表示した図

EXのNFT共有URLや相手のアドレスQRコード読み込むとNFTを見る事ができます。

購入を押したところ

購入を押すと 0XYM に対してSwapする数量1のMOSAICのIDがセットされます。
0XYMはこの取引で相手に送金する量=価格となります。
このまま送信すれば「タダ」で購入することになります。
NFTの説明などに書いてある販売価格や買い取りたい価格を設定します。

※中間システムの全くないオンチェーン個人間取引は新しい概念です、EXではインタフェースと規格を提案しています。
ここでは割愛しますがXYMではなくMOSAIC同士の交換も可能です。

トランザクションの内訳

Symbolブロックチェーンではアグリゲートトランザクションと言う機能があります。

最大100件までのバラバラのトランザクションを1つにまとめるという物です。
まとめる事によって各トランザクションに必要なすべての署名がそろわないと実行されません。
例えばトランザクションAとトランザクションB、トランザクションCがあり。

アグリゲートトランザクション
内訳
  トランザクションA 署名済
  トランザクションB 署名済
  トランザクションC 署名まだ

この状態だとトランザクションCが署名されるまで処理されることはありません。

EXではこのアグリゲートトランザクションを利用して3つトランザクションをまとめて送信し、売買を行います。
また、アグリゲートトランザクションでは作成時の順番が保持されていますので、順番が変わることはありません。
これはAPIからデータの取り出しの時に混乱することを防ぎます。

トランザクション1 支払い

最初のトランザクションは支払いになります。
NFTの購入の対価としてXYMを送信します。
※XYMではなく対価としてMOSAICを送信した場合はMOSAICに変わります。
取引の発起人が購入者なので署名済の状態になります。

トランザクション2 MOSAICの受け渡し

このトランザクションでNFTを取得します。
取引の発起人は購入者なので譲ってもらうための署名を求めます。

補足:相手のアドレスから自分のアドレスに送るようにトランザクションを作成します。この場合必ず相手の署名が必要になります。

トランザクション3 ロイヤリティ

EXでは取引の度にNFTの作者へ20%のロイヤリティを送信します。
NFTの作者とはNFTDriveで作者として設定したアドレスになります。
もしくはMOSAIC-CENTERで設定した作者が自動的に検索されセットされます。それ以外のMOSAICはEXで売買することはできません。

※MOSAICの送信は可能です。
※EXのシステムではMOSAIC-CENTERの設定が優先されます。

これによりチェーンプロトコル機能では無いものの作者への不利益にならない仕組みを自主的に導入しています。

この取引では購入者がロイヤリティを支払いますので送信時には署名済となります。

取引の成立

前項での解説の通り3つのトランザクションがあります。
必要な署名が揃ったら全ての取引が同時に処理されます。

トランザクション1とトランザクション3は購入者がすでに署名していますので、トランザクション2のNFTを購入者に送信してもらうトランザクションに署名してもらう必要があります。

つまりNFTの所有者が購入者からオファーを受信した状態になります。
このトランザクション2(NFT所有者)の署名が完了すると取引が成立します。

※Symbolではこの署名待ちトランザクション PartialTransaction(PT)と呼びます。
PTは48時間キャッシュされ期限が切れると破棄されます。
48時間以内に署名をする必要があります。

実際のアグリゲートトランザクションサンプル


APIからトランザクションを取得します。
Symbol ブロックチェーンでは沢山のAPIエンドポイントをもつノードが稼働しています。そのどれもにアクセスすることができいつでも取得できます。

https://07.high-performance.symbol-node.jp:3001/transactions/confirmed/8C87E1451BC4A2A2D257B1CCB45155632F5CE9DA4FD6F692738C8EB4E5AD73E5

{
    "meta": {
        "height": "2323231",
        "hash": "8C87E1451BC4A2A2D257B1CCB45155632F5CE9DA4FD6F692738C8EB4E5AD73E5",
        "merkleComponentHash": "3DB8D3273B173EBAA7E42871E69F7073A06923C0AA5FCB58BC81D0818200CCA4",
        "index": 0,
        "timestamp": "69844868429",
        "feeMultiplier": 3333
    },
    "transaction": {
        "size": 600,
        "signature": "5AFA19113EC8CD2EA850FD3CC5021E667178122690C38C5D366B9EBB73578DCF0BA03255045FFF96EC121232805C102753A471785C205F542F771FFC5D5B5A09",
        "signerPublicKey": "57FB537FE5B83F6DCC1C2C9E8630F65D3920A40374AC16DB1548CA891FB48EA8",
        "version": 2,
        "network": 104,
        "type": 16961,
        "maxFee": "2000000",
        "deadline": "69937712000",
        "transactionsHash": "FDAEE3DB6CFF69971956A3E74B60B40E7285A313691F83E63B5FDEDA729FDFC2",
        "cosignatures": [
            {
                "version": "0",
                "signerPublicKey": "B8245BCB622D5C67623F86F47BA3E530027222FB3254F3FEDF48A17B8ABBC7D5",
                "signature": "125B4FF3948D79837A7C4075407BEB70077E2B6D3EE65DE726EACB857289B62BC128362E97DFF599B74F604076EB6D616FF0D2C86847900B3ED5DE35BA2AAB0E"
            }
        ],
        "transactions": [
            {
                "meta": {
                    "height": "2323231",
                    "aggregateHash": "8C87E1451BC4A2A2D257B1CCB45155632F5CE9DA4FD6F692738C8EB4E5AD73E5",
                    "aggregateId": "6479B60134B6F6345A0A406E",
                    "index": 0,
                    "timestamp": "69844868429",
                    "feeMultiplier": 3333
                },
                "transaction": {
                    "signerPublicKey": "57FB537FE5B83F6DCC1C2C9E8630F65D3920A40374AC16DB1548CA891FB48EA8",
                    "version": 1,
                    "network": 104,
                    "type": 16724,
                    "recipientAddress": "6819BB23286CB44379B5C4BBC91FD986F5EA712AACB687AB",
                    "mosaics": [
                        {
                            "id": "6BED913FA20223F8",
                            "amount": "5000000"
                        }
                    ]
                },
                "id": "6479B60134B6F6345A0A406F"
            },
            {
                "meta": {
                    "height": "2323231",
                    "aggregateHash": "8C87E1451BC4A2A2D257B1CCB45155632F5CE9DA4FD6F692738C8EB4E5AD73E5",
                    "aggregateId": "6479B60134B6F6345A0A406E",
                    "index": 1,
                    "timestamp": "69844868429",
                    "feeMultiplier": 3333
                },
                "transaction": {
                    "signerPublicKey": "B8245BCB622D5C67623F86F47BA3E530027222FB3254F3FEDF48A17B8ABBC7D5",
                    "version": 1,
                    "network": 104,
                    "type": 16724,
                    "recipientAddress": "687E4D36B0D49FD0FA480BFD7176A4CE14B1C53D04A2B739",
                    "mosaics": [
                        {
                            "id": "136C1A7DAE1E45DD",
                            "amount": "1"
                        }
                    ]
                },
                "id": "6479B60134B6F6345A0A4070"
            },
            {
                "meta": {
                    "height": "2323231",
                    "aggregateHash": "8C87E1451BC4A2A2D257B1CCB45155632F5CE9DA4FD6F692738C8EB4E5AD73E5",
                    "aggregateId": "6479B60134B6F6345A0A406E",
                    "index": 2,
                    "timestamp": "69844868429",
                    "feeMultiplier": 3333
                },
                "transaction": {
                    "signerPublicKey": "57FB537FE5B83F6DCC1C2C9E8630F65D3920A40374AC16DB1548CA891FB48EA8",
                    "version": 1,
                    "network": 104,
                    "type": 16724,
                    "recipientAddress": "68F89EDDC7BEFB66179327D429EBDAE506DE15FB22628D76",
                    "message": "004E4654447269766545582D6C6F79616C74795B313336433141374441453145343544445D",
                    "mosaics": [
                        {
                            "id": "6BED913FA20223F8",
                            "amount": "1000000"
                        }
                    ]
                },
                "id": "6479B60134B6F6345A0A4071"
            }
        ]
    },
    "id": "6479B60134B6F6345A0A406E"
}

transactionsの中がアグリゲートトランザクションの中見です。
3つあるtransactionがそれぞれ

支払い

MOSAIC受け渡し

ロイヤリティ

となっています。

トランザクションの取り出し

チャート機能を作るには
トランザクション履歴からアグリゲートトランザクションで検索します。
コードサンプルは長くなるので割愛しますが

はじめに対象のアドレスやMosaicIDでトランザクションを検索します。

条件

アグリゲートトランザクションである。
中身がが3つある。

トランザクション1はXYM(”6BED913FA20223F8”)
トランザクション2はXYMではない。
トランザクション3はXYMである。
かつ
トランザクション1とトランザクション2の署名者は同じである。


このパターンでマッチさせます。

※価格が0の時はトランザクション3はありません。

トランザクション1のmosaic.Amountから実際に支払った価格=取引価格を取得できます。

実際のチャート画面

取引のデータベースを持たずにブロックチェーンから取引データを抽出することができ、改竄不能な価格推移を表示します。

トラストレスな取引

普段の買い物であまり意識しませんが、
常に相手を信託(トラスト)して買い物をしています。
レジの人がお釣りを返さないか?w
はたまた自分が泥棒しないか?
商品はちゃんともらえるか?


しかしこのように1つのトランザクションの中に

代金を送る
商品を送る
ロイヤリティを送る

をパックにすることで
代金を送ったけど商品が届かない。
商品を送ったけど代金が届かない。
のような不正を防止します。

通常であればお金と商品をAmazon、ヤフー、メルカリなどのシステム、もしくは当事者同士が保証し管理しています。
ブロックチェーンがそれらに変わってわずかな手数料で行います。
またブロックチェーンでの”手数料”は”ネットワーク参加者”に分配される仕組みなので誰か1人が独占するものではありません。

取引に含まれる誰もがお互いを信用する事なく
トランザクションの内容に基づいてすべての署名が揃った時点で自動的に完了します。
チェーンが人の署名をもって信頼を担保しています。

あとがき


アグリゲートトランザクションを活用すれば今まで合意が困難だったシチュエーションにも利用ができ、更なる利用拡大が期待されます。
ブロックチェーンでのパブリックなデータベースが開発され誰もが利用できる時代が来ています。
データを取り出すツールが充実すると良いなと思います。
NFTDriveEXはゲートウェイ、インタフェースでありNFTの個人とのやり取りを簡単します。でわ。




この記事が気に入ったらサポートをしてみませんか?