try catch and ...release
ページ
ホーム
Chromeアプリ開発Tips
公開アプリ
Ubuntu
Linuxコマンド
#!/bin/bash
ブロックチェーンと暗号通貨
2017年6月2日金曜日
Ripple: XRPやアセットのトレード注文 (Offer)
[Rippleでアセットの発行と支払い](https://trycatchand.blogspot.jp/2017/06/ripple-asset-issuance-payment.html)に続き、今回はアセットの「トレード」を行う方法をまとめてみました。
## 目次 + [前提](#premise) + [注文を出す](#place-offer) + [注文板を見る](#orderbook) + [注文を約定させる](#fill-offer) + [注文をキャンセル](#cancel-offer) + [注文を監視](#watch-offer) + [参考](#refs) ## 前提 (premise) - トレード対象のアセット: **"XXX"** - 登場人物 + **issuer** (アセット発行者) アドレス: <issuer_address> + **user1** (ユーザ1) アドレス: <user1_address> + **user2** (ユーザ2) アドレス: <user2_address> - Ripple **TestNet** を利用 ## 注文を出す (place-offer) 注文を出すには`"TransactionType": "OfferCreate"`なトランザクションを投げます。 以下の例は **user2** による「**20 XXX 買 / 10 XRP 売**」(**1XXXあたり価格0.5XRPでXXX20単位買い**) な注文です: ``` { "TransactionType": "OfferCreate", "Account": "
", "TakerGets": "10000000", // 10 XRP 売り "TakerPays": { "currency": "XXX", "issuer": "
", "value": "20" // 20 XXX 買い }, "Fee": "10", "Flags": 2147483648, // デフォルトの tfFullyCanonicalSig フラグ "LastLedgerSequence": 8007750, // 最新のledger_index + 3 ぐらい "Sequence": 12 // user2のaccount_dataの"Sequence" } ``` ※今回も tx への `sign` と `submit` の説明は省きます。 ## 注文板を見る (orderbook) 例えば、先ほどの「**XXX 買 / XRP 売**」注文を見たいときは、以下のような JSON RPC リクエストを投げます: ``` { "jsonrpc": "2.0", "id": 0, "method": "book_offers", "params": [{ // "taker":
, // アドレスでフィルタリングも可能 "taker_gets": { "currency": "XRP" }, "taker_pays": { "currency": "XXX", "issuer": "
" }, "limit": 10 // 注文板表示の上下限度 }] } ``` **NOTE:** `taker_pays`は相手が払う通貨=つまり自分が買おうとしている通貨、そして`taker_gets`は相手が得る通貨=つまり自分が売ろうとしている通貨なのでご注意。初めは逆に考えていてハマりました... 上記リクエストのレスポンス: ``` { "ledger_current_index": 1641118, "offers": [ { "Account": "
", ... "Sequence": 8, // 注文キャンセル時に使うID "TakerGets": "10000000", // 10 XRP 売り "TakerPays": { "currency": "XXX", "issuer": "
", "value": "20" // 20 XXX 買い }, ... } ], ... } ``` この時点の **XXX** 注文状況: - user2: 20 XXX 買 / 10 XRP 売」 = **価格 1 XXX あたり 0.5 XRP で 数量 20 XXX 買い** **TIPS:** REST API: JSON RPC の他に REST API でも注文板を確認できます。 ただし、REST APIではアドレスの指定が必須になります: - 指定アドレスの全注文: `https://api.altnet.rippletest.net:5990/v1/accounts/
/orders` - アドレス and ベース通貨 and カウンター通貨を指定した注文板: `https://api.altnet.rippletest.net:5990/v1/accounts/
/order_book/
+
/
+
?limit=10` ## 注文を約定させる (fill-offer) 先ほどの注文を一部約定させてみましょう。 以下のトランザクションは、**user1** による 「**8 XPR 買 / 16 XXX 売**」な注文です: ``` { "TransactionType": "OfferCreate", "Account": "
", "TakerGets": { "currency": "XXX", "issuer": "
", "value": "16" // 16 XXX 売り }, "TakerPays": "8000000", // 8 XRP 買い "Fee": "10", "Flags": 2147483648, // デフォルトの tfFullyCanonicalSig フラグ "LastLedgerSequence": 8007750, // 最新のledger_index + 3 ぐらい "Sequence": 12 // user1のaccount_dataの"Sequence" } ``` 上記注文直後の **XXX** 注文状況: ``` { "ledger_current_index": 1642842, "offers": [ { "Account": "
", ... "Sequence": 8, "TakerGets": "2000000", // "10000000" => "2000000" [解説] 8 XRP 約定、残りの売り注文数量 2 XRP "TakerPays": { "currency": "XXX", "issuer": "
", "value": "4" // "20" => "4" [解説] 16 XXX 約定、残りの買い注文数量 4 XXX }, ... } ], ... } ``` **user1**の残高: ``` { "success": true, "ledger": 1642684, "validated": true, "balances": [ { "value": "10007.969498", // +8XRP "currency": "XRP", "counterparty": "" }, { "value": "32.4", // "50" => "32.4" [解説] 売数量 "16" に送金手数料の10% (1.6 XXX) が差し引かれている (送金手数料は issuer へ償還) "currency": "XXX", "counterparty": "
" } ] } ``` **user2**の残高: ``` { "success": true, "ledger": 1642679, "validated": true, "balances": [ { "value": "9992.03292", // -8XRP "currency": "XRP", "counterparty": "" }, { "value": "16", // "0" => "16" 増えた "currency": "XXX", "counterparty": "
" } ] } ``` ## 注文をキャンセル (cancel-offer) 残った注文をキャンセルしてみましょう。 `"OfferSequence"`※を指定して`"TransactionType": "OfferCancel"`なトランザクションを投げます: ``` { "TransactionType": "OfferCancel", "Account": "
", "OfferSequence": 8, "Fee": "12", "Flags": 2147483648, // デフォルトの tfFullyCanonicalSig フラグ "LastLedgerSequence": 8007750, // 最新のledger_index + 3 ぐらい "Sequence": 12 // user2のaccount_dataの"Sequence" } ``` ※`OfferSequence`の値は注文状況のレスポンスに含まれている`Sequence`の値です: 上記の注文キャンセル直後の **XXX** 注文状況: ``` { "ledger_current_index": 1643706, "offers": [], "status": "success", "validated": false } ``` 注文が消えました。 ## 注文を監視 (watch-offer) 注文は WebSocket API の Book Stream からリアルタイムに取得することもできます。 以下のようなWebSocketリクエストを投げることで **XRP 買 / XXX 売** な注文の監視が開始されます: ``` { "id": "Unsubscribe a lot of stuff", "command": "subscribe", "books": [ { "taker_gets": { "currency": "XRP" }, "taker_pays": { "currency": "XXX", "issuer": "
" }, "both": true } ] } ``` 流れてくるデータは以下のような感じです。 注文発注時: ``` { engine_result: 'tesSUCCESS', engine_result_code: 0, engine_result_message: 'The transaction was applied. Only final in a validated ledger.', ledger_hash: '5F9FDF5496F1A6FDA42CC909DCD996334499869BE46471620C199ADDF531CB49', ledger_index: 1644574, meta: { AffectedNodes: [ [Object], [Object], [Object], [Object] ], TransactionIndex: 0, TransactionResult: 'tesSUCCESS' }, status: 'closed', transaction: { Account: '
', Fee: '10', Flags: 2147483648, LastLedgerSequence: 1644574, Sequence: 32, SigningPubKey: '02C301D531D49A99D66E1FB8E8D101384436D0FA31E2D2F8E43DA1C538591096F7', TakerGets: '8000000', TakerPays: { currency: 'XXX', issuer: '
', value: '4' }, TransactionType: 'OfferCreate', TxnSignature: '304402200A275BD1CC3045F5B76FBAA18D1F1A19D72710E5923F235CB9EB921C3469649502204022289CF2FD4A0FF673FE35A3AE5DF3B77D7A3620535D32C2DF52B509C8DD10', date: 549692931, hash: '8E64C95F1B575E993A486C580DEE328D7EF29E82552F3FE389BAB4DAA90357DA', owner_funds: '9977969468' }, type: 'transaction', validated: true } ``` 注文キャンセル時: ``` { engine_result: 'tesSUCCESS', engine_result_code: 0, engine_result_message: 'The transaction was applied. Only final in a validated ledger.', ledger_hash: '51B2F7AD7D42885136AD5B7231A3DB1EF4CED0F0BFC0C96C715E8035F4AF7DC9', ledger_index: 1644259, meta: { AffectedNodes: [ [Object], [Object], [Object], [Object] ], TransactionIndex: 3, TransactionResult: 'tesSUCCESS' }, status: 'closed', transaction: { Account: '
', Fee: '10', Flags: 2147483648, LastLedgerSequence: 1644259, OfferSequence: 30, Sequence: 31, SigningPubKey: '02C301D531D49A99D66E1FB8E8D101384436D0FA31E2D2F8E43DA1C538591096F7', TransactionType: 'OfferCancel', TxnSignature: '3045022100B88DBE3EDF4A6855E79A7250BB753B46BBE3329AC982EC8F812D64ADB6D3F91602204D2A34587FC9F163930D4A3A1E05D285EF2A1A6947714F99C7A7EABE73ED542F', date: 549691980, hash: 'B3DA9C74FAAD3620A5E447C877D99F6648D36EDC9D4F7AA9212F4E0F529211CB' }, type: 'transaction', validated: true } ``` `transaction.TransactionType`で注文データかどうかを識別できそうです。 以上です。 ## 参考 (refs) [Transactions OfferCreate | Ripple](https://ripple.com/build/transactions/#offercreate) [rippled-apis: book_offers | Ripple](https://ripple.com/build/rippled-apis/#book-offers) [rippled-apis: Order Book Streams | Ripple](https://ripple.com/build/rippled-apis/#order-book-streams)
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿