Azure APIコンソールからAPI呼び出し
APIコンソール
APIコンソールを利用することで、APIをブラウザから実行できます。
APIコンソールからAPI呼び出し
1.Azureポータルを開いて、リソースグループをクリック
2. 対象のリソースグループをクリック
3. 対象のインスタンスをクリック
4. 左メニューからキーとエンドポイントをクリック
5. キーをコピー (コピーアイコンをクリック)
6. クイックスタートに戻り、APIコンソールをクリック
7. Japan Eastをクリック
8. Host, Ocp-Apim-Subscription-Key, 画像URLを設定してSendをクリック
画像URLは以下を設定
9. レスポンス確認
Azure Face APIを使うためにリソース作成
Azure Face API
画像内の顔を分析する AI サービス
アプリに顔認識を埋め込んで、高度なセキュリティで保護されたシームレスなユーザー エクスペリエンスを実現できます。
Azure Face APIを使うためにはリソースを作成する必要があります。本記事ではリソースの作り方について書きます。
リソース作成方法
1.Azureポータルを開いて、リソースの作成をクリック
2. AI + Machine Learningをクリック
3. 画面右のFaceをクリック
4. 各設定値を入力
リソースグループ、インスタンスの名前は適当に設定しましたが、推奨される名前付けおよびタグ付け規則があるようです。詳細は下記を見てください。
5. タグ設定
空欄のまま、「次: 確認および作成 >」をクリック
6. タグ設定
も入力せずに「次: 確認および作成 >」をクリック
7. 作成クリック
8. デプロイ完了
リソースに移動をクリック
9. クイックスタート画面表示
Azureの有料アカウントにサインアップする方法
Azure 無料アカウント
Azure 無料アカウントでは、最初の 30 日間に使用できる 200 ドルの Azure クレジットと 12 か月の無料サービス (数に制限あり) が提供されます。
有効期限内のクレジットがあるか、または無料のサービスを制限の範囲内で使用する限り、料金は請求されません。
クレジットの残高がなくなるか、30 日が経過して有効期限が切れると、ご利用のサブスクリプションとサービスは無効になります。
Azure 無料アカウントでの課金を避ける | Microsoft Docs
有効期限が切れると、サブスクリプションとサービスは無効になるため、意図しない料金が発生することを防ぐことができます。
本記事では、クレジットを使い果たした、または期限切れの場合に、有料のサブスクリプションとサービスに登録する方法について書きます。
Azureアカウント登録方法
1.Azureにログインする
無料アカウントの利用期限が終了したため、有料プランへの移行を求められます。
2. 支払情報を入力
3. テクニカルサポートを追加する
追加する必要がない場合は一番下の選択肢を選びます。
4. アグリーメントにチェックしてサインアップ
参考
Azureアカウント登録方法
Azureアカウントとは
そもそもAzureとは、サーバ・ストレージ・ネットワーク・分析などのサービスを、必要な時に必要な分だけ、インターネットを介してレンタル(利用)することができるクラウドサービスのひとつです。
Azureアカウントとは、こうしたAzureサービスを利用するための権限のことです。このAzureアカウントを取得することで、Azureサービスを利用したり、利用中のサービスを管理したりする「Microsoft Azure Portal」(以下、Azureポータル)にアクセスできるようになります。
Azure Cognitive Servicesを利用したい場合、Azureアカウントが必要になります。
Azureアカウント登録方法
1.アカウント作成画面にアクセス
Azure の無料アカウントを今すぐ作成しましょう | Microsoft Azure
2. 画面中央の 「無料で始める」 をクリック
3. 「作成」リンクをクリック
4. メールアドレスを入力して、「次へ」ボタンをクリック
5. パスワードを入力して、「次へ」ボタンをクリック
6. メールアドレスに受信したコードを入力して、「次へ」ボタンをクリック
7. 表示されている文字を入力して、「次へ」ボタンをクリック
8. プロフィールを入力して、「次へ」ボタンをクリック
9. カード情報を入力して、「次へ」ボタンをクリック
10. 規約に同意して、「次へ」ボタンをクリック
11. 「アカウントを設定しています...」と表示されるので、画面が自動で変わるまで待つ
12. 「Azureの利用開始の準備ができました!」と表示されるので、「ポータルに移動」ボタンをクリック
13. ポータルサイトにログインできる
IBM Cloudライト・アカウント登録方法
IBM Cloudライト・アカウントとは
"IBM Watson APIを始め、データベースやデータ分析基盤といったIBM Cloudの機能を無料で気軽に試すことができるようになった。AIを試してみたいという企業や個人のデベロッパーにとっては朗報だ。"
"利用期間に制限がない。使用料金が発生することがないため、クレジットカードなどの登録も不要だ。"
AI開発者に聞く。Watson APIを無料で試せ!「IBM Cloudライト・アカウント」の価値
https://www.ibm.com/think/jp-ja/business/ibmcloud-lite-account/
クレジットカードを登録せずにお試し利用できる点が嬉しいです。
「私の会社では、エンジニアのコアバリューに『つくるな、使え』と掲げています。言うなれば、開発することを極端に否定しようとしている。オープンソースが進み、APIエコシステムがここまで発達した現代に、車輪の再発明をしても意味がありません。あえてシステムをつくらずとも、組み合わせて動くのであればそちらの方が良いと考えています」
私も自社のコアビジネスに集中した方がよいと思います。(個人的な趣味としては車輪の再発明は大好きです)
IBM Cloudライト・アカウント登録方法
1. IBM Cloudにアクセス
2. 画面右上の 「Cloud登録 / ログイン」 をクリック
3. Eメール、パスワードを入力後、「次へ」ボタンをクリック
4. 検証コード入力後、「次へ」ボタンをクリック
5. 個人情報入力後、「次へ」ボタンをクリック
6. ご利用条件に同意後、「アカウントの作成」ボタンをクリック
ログイン方法
1. IBM Cloudログイン画面にアクセス
2. アカウント・プライバシーについて同意後、「次に進む」ボタンをクリック
3. ダッシュボード画面表示
Counterpartyトークンをマルチシグで送受信する
今回やること
- APIを使ってマルチシグアドレスにトークンを送る
- APIを使ってマルチシグアドレスからトークンを送る
- APIを使ってマルチシグアドレス(P2SH)にトークンを送る
- APIを使ってマルチシグアドレス(P2SH)からトークンを送る
はじめに
Counterpartyd、Counterwalletにはトークンをマルチシグ管理するための機能があるので、通常のトークン送信と同じような方法で送受信ができます。
P2SHアドレスの作成と署名は、現在Counterwalletに機能がないためBitcoinJSを利用します。
1. APIを使ってマルチシグアドレスにトークンを送る
APIパラメータ
(1) destination
1_addressA_addressB_2 の形式でマルチシグを表現します。現在以下5種類をサポートしています。(1-of-2, 2-of-2, 1-of-3, 2-of-3, 3-of-3)
(2) pubkey
ビットコインアドレスのpubkeyを設定します。ブロックチェーンにpubkeyがある場合(一度でもブロードキャストされている場合)は設定しなくてもよいです。(ただし過去のトランザクションデータの検索が必要になるので、設定しておいた方がレスポンスは早いです)
(3) use_enhanced_send
これはfalseに設定してください。(最近のバージョンから使えるenhanced_sendに対応してません。ちなみに現在のCounterwalletではtrueが設定されていて画面からトークンが送信できないバグがあります。enhanced_sendのプロトコルレベルでマルチシグが利用できるか(想定しているか)は調べてません)
パラメータ例
{ "method": "create_send", "params": { "source": "n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie", "destination": "2_n2LX8EHbqkfvW4kJckZjmTgiSzH2kUZzAB_n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie_2", "quantity": 1000000, "asset": "XCP", "pubkey": [ "02f9e5e548e9e11d376da691871353bb2ceeba9d82548ab6a81d297d2787516a14", "028383af700eef090f13e7e2119c388c1934f9f4b1ecad1ac21125ad0ee349933b" ], "allow_unconfirmed_inputs": true, "fee_per_kb": 472064, "use_enhanced_send": false }, "jsonrpc": "2.0", "id": 0 }
API実行結果
$ curl -X POST http://localhost:14000/api/ --user user:password -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript' --data-binary '{"method":"create_send","params":{"source":"n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie","destination":"2_n2LX8EHbqkfvW4kJckZjmTgiSzH2kUZzAB_n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie_2","quantity":100000000,"asset":"XCP", "pubkey":["02f9e5e548e9e11d376da691871353bb2ceeba9d82548ab6a81d297d2787516a14", "028383af700eef090f13e7e2119c388c1934f9f4b1ecad1ac21125ad0ee349933b"],"allow_unconfirmed_inputs":true,"fee_per_kb":472064,"use_enhanced_send":false}, "jsonrpc": "2.0", "id": 0}' {"result": "0100000001e995b3dd7ded5a644d9cef5efeeda798015e5fee3df18b02d501edd9f944c867010000001976a914fecc451e74d541dc1a4505d9ab9d560c07267e0188acffffffff03781e000000000000475221028383af700eef090f13e7e2119c388c1934f9f4b1ecad1ac21125ad0ee349933b2102f9e5e548e9e11d376da691871353bb2ceeba9d82548ab6a81d297d2787516a1452ae00000000000000001e6a1c65e4ede30a5290d4a8e8e57d3d32a6e8826f012ede3977c40bd6758787404101000000001976a914fecc451e74d541dc1a4505d9ab9d560c07267e0188ac00000000", "jsonrpc": "2.0", "id": 0}
承認後の残高確認
$ curl -X POST http://localhost:14000/api/ --user user:password -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript' --data-binary '{"jsonrpc":"2.0", "id":0, "method":"get_balances", "params":{"filters": {"field": "address", "op": "==", "value": "2_n2LX8EHbqkfvW4kJckZjmTgiSzH2kUZzAB_n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie_2"}}}' {"result": [{"quantity": 1, "asset": "XCP", "address": "2_n2LX8EHbqkfvW4kJckZjmTgiSzH2kUZzAB_n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie_2"}], "id": 0, "jsonrpc": "2.0"}
2. APIを使ってマルチシグアドレスからトークンを送る
APIパラメータ
(1) source
上記と同様に 1_addressA_addressB_2 の形式でマルチシグを表現します。
API実行結果
$ curl -X POST http://localhost:14000/api/ --user user:password -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript' --data-binary '{"method":"create_send","params":{"source":"2_n2LX8EHbqkfvW4kJckZjmTgiSzH2kUZzAB_n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie_2","destination":"n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie","quantity":100000000,"asset":"XCP", "allow_unconfirmed_inputs":true,"fee_per_kb":472064}, "jsonrpc": "2.0", "id": 0}' {"result": "0100000001f9ea921f702633733fdbff3758000fc7478ce1f91b3ae16b20eecff86e2950f900000000475221028383af700eef090f13e7e2119c388c1934f9f4b1ecad1ac21125ad0ee349933b2102f9e5e548e9e11d376da691871353bb2ceeba9d82548ab6a81d297d2787516a1452aeffffffff020000000000000000306a2e3e374eef6d20de55f34da21729e57c9a090db808d803719d684bef3475ca77b131a6f5171042fc264fc7bc0363c95790960000000000475221028383af700eef090f13e7e2119c388c1934f9f4b1ecad1ac21125ad0ee349933b2102f9e5e548e9e11d376da691871353bb2ceeba9d82548ab6a81d297d2787516a1452ae00000000", "id": 0, "jsonrpc": "2.0"}
上記のhexを2つのアドレスの秘密鍵で署名してブロードキャストできます。(CounterwalletのSign機能を利用できます)
3. APIを使ってマルチシグアドレス(P2SH)にトークンを送る
P2SHアドレス作成
P2SHアドレスの作成は、現在Counterwalletに機能がないためBitcoinJSを利用します。
var bitcoin = require('bitcoinjs-lib') var pubKeys = [ '02f9e5e548e9e11d376da691871353bb2ceeba9d82548ab6a81d297d2787516a14', '028383af700eef090f13e7e2119c388c1934f9f4b1ecad1ac21125ad0ee349933b' ].map(function (hex) { return Buffer.from(hex, 'hex') }) var redeemScript = bitcoin.script.multisig.output.encode(2, pubKeys) var scriptPubKey = bitcoin.script.scriptHash.output.encode(bitcoin.crypto.hash160(redeemScript)) var address = bitcoin.address.fromOutputScript(scriptPubKey, bitcoin.networks.testnet) console.log(address) // 2MvEVnmi8yVvvJFugHBQNhyJpNpQdSYCYUR
API実行結果
$ curl -X POST http://localhost:14000/api/ --user user:password -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript' --data-binary '{"method":"create_send","params":{"source":"n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie","destination":"2MvEVnmi8yVvvJFugHBQNhyJpNpQdSYCYUR","quantity":100000000,"asset":"XCP", "allow_unconfirmed_inputs":true,"fee_per_kb":472064}, "jsonrpc": "2.0", "id": 0}' {"result": "0100000001817f90d369aae1c1753a4d675ad9d30aa58b10b6c81d91ecc013bacdca39b18a020000001976a914fecc451e74d541dc1a4505d9ab9d560c07267e0188acffffffff020000000000000000306a2e3b55ea1002c5b45e1837e8d3354db858412f36ab5f5100335b76c8ef06a6833b375f48de208a833118580e84d137a4b3a200000000001976a914fecc451e74d541dc1a4505d9ab9d560c07267e0188ac00000000", "id": 0, "jsonrpc": "2.0"}
承認後の残高確認
$ curl -X POST http://localhost:14000/api/ --user user:password -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript' --data-binary '{"jsonrpc":"2.0", "id":0, "method":"get_balances", "params":{"filters": {"field": "address", "op": "==", "value": "2MvEVnmi8yVvvJFugHBQNhyJpNpQdSYCYUR"}}}' {"result": [{"quantity": 1, "asset": "XCP", "address": "2MvEVnmi8yVvvJFugHBQNhyJpNpQdSYCYUR"}], "id": 0, "jsonrpc": "2.0"}
4. APIを使ってマルチシグアドレス(P2SH)からトークンを送る
APIを利用して、未サイントランザクションhexを生成して、BitcoinJSを利用してサインします。
API実行結果
$curl -X POST http://localhost:14000/api/ --user user:password -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript' --data-binary '{"method":"create_send","params":{"source":"2MvEVnmi8yVvvJFugHBQNhyJpNpQdSYCYUR","destination":"n4kCdhxto4RkLP7NA2DPT41ExfHTHBa7ie","quantity":100000000,"asset":"XCP", "allow_unconfirmed_inputs":true,"fee_per_kb":472064}, "jsonrpc": "2.0", "id": 0}' {"result": "01000000010e9a3cedf9e67c5083f01be362e57d54e3bc850266f06e0d2a8523e3226693770000000017a91420c526de2efaf3f6ffe39c31eeb9379b59fcbb2287ffffffff020000000000000000306a2e502965d769b0e92678d81371298a0e7b85dcf613a57500432f8ab61f6791b36093b8c459f7113cbf6f6752c43905173c0d000000000017a91420c526de2efaf3f6ffe39c31eeb9379b59fcbb228700000000", "id": 0, "jsonrpc": "2.0"}
BitcoinJSを利用して署名
var bitcoin = require('bitcoinjs-lib'); var pubKeys = [ '02f9e5e548e9e11d376da691871353bb2ceeba9d82548ab6a81d297d2787516a14', '028383af700eef090f13e7e2119c388c1934f9f4b1ecad1ac21125ad0ee349933b' ].map(function (hex) { return Buffer.from(hex, 'hex') }) var privKeys = [ 'cNGfHoZMstBj6y7Hag5Yio7VgX6cFGNX6sSj1wgT8Gm5MuoZ1kXs', 'cR7HBcJqAXGyBPHZ8nH2YQiek7ysVLGzc1NkF2k85HGBgEpjpWJA' ].map(function (wif) { return bitcoin.ECPair.fromWIF(wif, bitcoin.networks.testnet) }) var redeemScript = bitcoin.script.multisig.output.encode(2, pubKeys); var tx = bitcoin.Transaction.fromHex('01000000010e9a3cedf9e67c5083f01be362e57d54e3bc850266f06e0d2a8523e3226693770000000017a91420c526de2efaf3f6ffe39c31eeb9379b59fcbb2287ffffffff020000000000000000306a2e502965d769b0e92678d81371298a0e7b85dcf613a57500432f8ab61f6791b36093b8c459f7113cbf6f6752c43905173c0d000000000017a91420c526de2efaf3f6ffe39c31eeb9379b59fcbb228700000000'); var txb = bitcoin.TransactionBuilder.fromTransaction(tx, bitcoin.networks.testnet); var rawSignedTransaction; txb.tx.ins.forEach(function(input, i) { txb.inputs[i] = {}; txb.sign(i, privKeys[0], redeemScript); txb.sign(i, privKeys[1], redeemScript); try { rawSignedTransaction = txb.build().toHex(); console.log('Successfully signed.'); } catch (e) { if ('Transaction is missing signatures' === e.message) { // Normal, because every inputs are not signed yet. rawSignedTransaction = txb.buildIncomplete().toHex(); } else if ('Not enough signatures provided' === e.message) { console.log('Not enough signatures provided'); rawSignedTransaction = txb.buildIncomplete().toHex(); } else { console.log(e); } } }); console.log(rawSignedTransaction); // 01000000010e9a3cedf9e67c5083f01be362e57d54e3bc850266f06e0d2a8523e32266937700000000d90047304402206f8c21a72173fef6c6a1de85b8dc0f89e3552a4aad797ed529f25bdcbe558f490220393a8e0240e51832cae9ce123ba784a44888d53343b70c651da647057a80a6e9014730440220585e686b97ea3a0368c0037dab398b7e175d925a1192ca08b64d28abf8702c5b0220296b45dc90cf0b8267a51b42b00c7979592bca214cb009f358183ca32f4dfb4b0147522102f9e5e548e9e11d376da691871353bb2ceeba9d82548ab6a81d297d2787516a1421028383af700eef090f13e7e2119c388c1934f9f4b1ecad1ac21125ad0ee349933b52aeffffffff020000000000000000306a2e502965d769b0e92678d81371298a0e7b85dcf613a57500432f8ab61f6791b36093b8c459f7113cbf6f6752c43905173c0d000000000017a91420c526de2efaf3f6ffe39c31eeb9379b59fcbb228700000000
TXEDITORを使ってCounterparty送信トランザクションを作る
今回はCounterparty送信トランザクション
前回はトランザクション作成ツール「TXEDITOR」を使ってP2SHトランザクションを作成しました。今回はCounterpartyの送信トランザクションを作ります。
Counterparty送信トランザクション
Counterpartyトークンを送信する方法は以下3つありますが、今回はOP_RETURNを利用します。
- OP_RETURN
- OP_CHECKSIG
- OP_CHECKMULTISIG
OP_RETURNのデータの例は以下になります。詳しくは後で説明します。
434e545250525459|00000000|000000000004fadf000000174876e800000000000000000000000000 | | | | | └── All of this is the operation data (maximum 28 bytes) | └──────────────── This is the transaction type identifier (4 bytes) └───────────────────────────────── The string CNTRPRTY in hexadecimal (8 bytes)
Counterparty Spec : Encoding a transaction
送信トランザクションの場合のoperation data部は以下になります。
000000000004fadf|000000174876e800 | | | └───── quantity (8 bytes) └────────────────── asset name (8 bytes)
counterparty-spec
Counterparty Spec : Send Transactions
Counterparty Spec : Asset Names
TXEDITORによるトランザクション作成
1.事前準備
- (1) bitcore-libインストール
- (2) 新規アドレス作成JS作成
- (3) 送信元アドレス作成
- (4) 送信先アドレス作成
- (5) 送信元アドレスにBitcoinを送付
- (6) 送信元アドレスにXCPを送付 ⭐
(1) bitcore-libインストール
$ mkdir /tmp/txeditor $ cd /tmp/txeditor $ npm install bitcore-lib $ vi new_address.js
(2) 新規アドレス作成JS作成 (new_address.js)
var bitcore = require('bitcore-lib'); var network = 'testnet'; var privateKey = new bitcore.PrivateKey(network); console.log("Private Key : " + privateKey.toString()); console.log("Private Key (WIF) : " +privateKey.toWIF()); console.log("Public Key : " + privateKey.toPublicKey().toString()); console.log("Bitcoin Address : " + privateKey.toPublicKey().toAddress().toString()); var script = new bitcore.Script.buildPublicKeyHashOut(privateKey.toPublicKey()); console.log("Locking Script : " + script.toString()); console.log("Locking Script (HEX) : " + script.toHex());
(3) 送信元アドレス作成
$ node new_address.js Private Key : 3457c3b9843716e6195a835a2a3f9e3b6869e90e15fe4ee95ff5641d6507790b Private Key (WIF) : cPLT1aBU1EuiaTUS8GNLZoJ2XpZ2FFZW2AekJ9DPAW89gaJp93Ts Public Key : 03dd39d15bba279bff1bda974b0eea1f1d7eec3b9cfc36fd3b47620545b1b825f7 Bitcoin Address : myyTr8P4GYZnWJ7Uj12dKDUyd1umDDYkiU Locking Script : OP_DUP OP_HASH160 20 0xca75bfabeda7cd51307f2ced429dcd0656ac0735 OP_EQUALVERIFY OP_CHECKSIG Locking Script (HEX) : 76a914ca75bfabeda7cd51307f2ced429dcd0656ac073588ac
(4) 送信先アドレス作成
$ node new_address.js Private Key : 486b6e4cb70e765e6e1ce14262774f0db2ba74e7d6cc2014c50df2ef1c983de5 Private Key (WIF) : cQ1UZT61zivtnGkyuDJySJ1fbtDtgTdqf84JvQc6UCBBzRXXwjYD Public Key : 02937574d4f830cfa93a9b5982e12fd8c693ea62a0e58f62818a02eb642658df41 Bitcoin Address : n2HAAsUB9933V75VvH1Rr6zY4tAwHhYk76 Locking Script : OP_DUP OP_HASH160 20 0xe3bebb5140450dce9e434275c68467ce1b1a1667 OP_EQUALVERIFY OP_CHECKSIG Locking Script (HEX) : 76a914e3bebb5140450dce9e434275c68467ce1b1a166788ac
以下サイトから送信元アドレスを入力するとTestnetで使えるBitcoinがもらえます
(6) 送信元のUTXO取得 ⭐
UTXOはIndieSquare APIを利用して取得します。
$ curl https://apitestnet.indiesquare.me/v2/addresses/myyTr8P4GYZnWJ7Uj12dKDUyd1umDDYkiU/utxos [ { "scriptPubKey":"76a914ca75bfabeda7cd51307f2ced429dcd0656ac073588ac", "vout":0, "confirmations":0, "txid":"2eda1b80859112c4235680302982c00477ced7cfc5a4f92db975ae185ff1873d", "amount":0.18 } ]
XCPを入手するにはBTCをBURN(燃やす!)する必要があります。
- source = 送信元アドレス
- quantity = utxo.amoutの一部(適当でよいですが全部はダメです)
(7)-1 BURNトランザクションを作成
curl -X POST https://public.coindaddy.io:14001/api/ --user rpc:1234 -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript' --data-binary '{"jsonrpc":"2.0", "id":0, "method":"create_burn", "params":{"source":"myyTr8P4GYZnWJ7Uj12dKDUyd1umDDYkiU", "quantity":10000000}}' { "result":"01000000013d87f15f18ae75b92df9a4c5cfd7ce7704c0822930805623c4129185801bda2e000000001976a914ca75bfabeda7cd51307f2ced429dcd0656ac073588acffffffff0280969800000000001976a914a11b66a67b3ff69671c8f82254099faf374b800e88ac07fc7900000000001976a914ca75bfabeda7cd51307f2ced429dcd0656ac073588ac00000000", "id":0, "jsonrpc":"2.0" }
(7)-2 BURNトランザクションデコード
$ curl -H "Content-Type: application/json" -X POST -d '{"tx": "01000000013d87f15f18ae75b92df9a4c5cfd7ce7704c0822930805623c4129185801bda2e000000001976a914ca75bfabeda7cd51307f2ced429dcd0656ac073588acffffffff0280969800000000001976a914a11b66a67b3ff69671c8f82254099faf374b800e88ac07fc7900000000001976a914ca75bfabeda7cd51307f2ced429dcd0656ac073588ac00000000"}' https://apitestnet.indiesquare.me/v2/transactions/decode { "txid":"a12fa0dbced9e03109d1581579328e8bc31f4694e072eddedd034818b0a063c7", "size":144, "version":1, "locktime":0, "vin":[ { "txid":"2eda1b80859112c4235680302982c00477ced7cfc5a4f92db975ae185ff1873d", "vout":0, "scriptSig":{ "asm":"OP_DUP OP_HASH160 ca75bfabeda7cd51307f2ced429dcd0656ac0735 OP_EQUALVERIFY OP_CHECKSIG", "hex":"76a914ca75bfabeda7cd51307f2ced429dcd0656ac073588ac" }, "sequence":4294967295 } ], "vout":[ { "value":0.1, "n":0, "scriptPubKey":{ "asm":"OP_DUP OP_HASH160 a11b66a67b3ff69671c8f82254099faf374b800e OP_EQUALVERIFY OP_CHECKSIG", "hex":"76a914a11b66a67b3ff69671c8f82254099faf374b800e88ac", "reqSigs":1, "type":"pubkeyhash", "addresses":[ "mvCounterpartyXXXXXXXXXXXXXXW24Hef" ] } }, { "value":0.07994375, "n":1, "scriptPubKey":{ "asm":"OP_DUP OP_HASH160 ca75bfabeda7cd51307f2ced429dcd0656ac0735 OP_EQUALVERIFY OP_CHECKSIG", "hex":"76a914ca75bfabeda7cd51307f2ced429dcd0656ac073588ac", "reqSigs":1, "type":"pubkeyhash", "addresses":[ "myyTr8P4GYZnWJ7Uj12dKDUyd1umDDYkiU" ] } } ] }
(7)-3 BURNトランザクションサイン
- デコードした内容を入力
- 送信元アドレスのPrivate Key (WIF) を入力してサインボタンクリック
- Script = Signature + Hash Type<改行>送信元のPublic Key
- txins[0].signature_script = Script.Hex
(7)-4 BURNトランザクションBroadcast実行
$ curl -H "Content-Type: application/json" -X POST -d '{"tx": "01000000013d87f15f18ae75b92df9a4c5cfd7ce7704c0822930805623c4129185801bda2e000000006a47304402202f77a12084eb191157bbb1e40bb8ccaef1363aa27de7737ad03771bdf0345a6402203cd4c56443cb654207fbf6452a9baa55d8d7ce9a6cd601ffdb426e18f1e03b8c012103dd39d15bba279bff1bda974b0eea1f1d7eec3b9cfc36fd3b47620545b1b825f7ffffffff0280969800000000001976a914a11b66a67b3ff69671c8f82254099faf374b800e88ac07fc7900000000001976a914ca75bfabeda7cd51307f2ced429dcd0656ac073588ac00000000"}' https://apitestnet.indiesquare.me/v2/transactions/broadcast { "txid":"c8bc0c660fbfc57bc6f72a5941c420b110924da2aa4703cd473182c51387e46d" }
(7)-5 Counterparty残高確認
curl https://apitestnet.indiesquare.me/v2/addresses/myyTr8P4GYZnWJ7Uj12dKDUyd1umDDYkiU/balances [ { "token":"BTC", "balance":0.07994375, "unconfirmed_balance":0 }, { "token":"XCP", "balance":139.49001647, "unconfirmed_balance":0 } ]
XCPがあれば成功です! これで事前準備完了です。
2.送信元のUTXO取得
UTXOはIndieSquare APIを利用して取得します。
$ curl https://apitestnet.indiesquare.me/v2/addresses/myyTr8P4GYZnWJ7Uj12dKDUyd1umDDYkiU/utxos [ { "scriptPubKey":"76a914ca75bfabeda7cd51307f2ced429dcd0656ac073588ac", "vout":0, "confirmations":0, "txid":"77774b1a63393c85ed676b527a5565d46c6db002fdaf851276a56dea918c6be1", "amount":0.14 } ]
#一回ミスったのでUTXO作り直してます.. (気にしないでください)
3.データアウトプットScript作成
1XCPを送信するScriptを作ります。
データ仕様を再度記載します。
434e545250525459|00000000|000000000004fadf000000174876e800000000000000000000000000 | | | | | └── All of this is the operation data (maximum 28 bytes) | └──────────────── This is the transaction type identifier (4 bytes) └───────────────────────────────── The string CNTRPRTY in hexadecimal (8 bytes)
000000000004fadf|000000174876e800 | | | └───── quantity (8 bytes) └────────────────── asset name (8 bytes)
(1)データ作成
- CNTRPRTY = 434e545250525459 (固定)
- Transaction Type = 00000000
- Asset Name = XCP (0000000000000001)
- Quantity = 1XCP(100000000 satoshi) (0000000005f5e100)
434e5452505254590000000000000000000000010000000005f5e100
(2)データをARC4暗号化
434e5452505254590000000000000000000000010000000005f5e100
をARC4暗号化します。秘密鍵はUTXOのindex=0のtxidです。(77774b1a63393c85ed676b527a5565d46c6db002fdaf851276a56dea918c6be1)
以下のサイトを利用できます。 http://rc4.online-domain-tools.com/
結果は761da27c8722993ed07d6b2020333248a7964907b65a1884b6374be6
になります。
(3)Script作成
各データを連携します。
OP_RETURN(6a) + データのバイト数(16,1c) + 暗号化したデータ 6a1c761da27c8722993ed07d6b2020333248a7964907b65a1884b6374be6
4.TXEDITOR (Transactionタブ)を入力
5.TXEDITOR (Signature(HASHTYPE_ALL))を入力
6.TXEDITOR (Script)を入力
7.TXEDITOR (Transactionタブ)を入力
8.decodeRawTransaction実行
確認のために、decodeRawTransactionを実行
curl -H "Content-Type: application/json" -X POST -d '{"tx": "0100000001e16b8c91ea6da5761285affd02b06d6cd465557a526b67ed853c39631a4b7777000000006a47304402202cf13fcee4c4d40706556b5653c78063284557acf138bf1ab4e0dc3bc83f18b002203c3449a83dd03cc2eff8a34d74e5e4d869adf0e9880ee4eea37745c70ae0c6d3012103dd39d15bba279bff1bda974b0eea1f1d7eec3b9cfc36fd3b47620545b1b825f7ffffffff02e018d400000000001976a914e3bebb5140450dce9e434275c68467ce1b1a166788ac00000000000000001e6a1c761da27c8722993ed07d6b2020333248a7964907b65a1884b6374be600000000"}' https://apitestnet.indiesquare.me/v2/transactions/decode { "txid":"b6093ea814127808a4fd2e2176d4dc0a44d7babc171e75362afe7b81153e6853", "size":230, "version":1, "locktime":0, "vin":[ { "txid":"77774b1a63393c85ed676b527a5565d46c6db002fdaf851276a56dea918c6be1", "vout":0, "scriptSig":{ "asm":"304402202cf13fcee4c4d40706556b5653c78063284557acf138bf1ab4e0dc3bc83f18b002203c3449a83dd03cc2eff8a34d74e5e4d869adf0e9880ee4eea37745c70ae0c6d3[ALL] 03dd39d15bba279bff1bda974b0eea1f1d7eec3b9cfc36fd3b47620545b1b825f7", "hex":"47304402202cf13fcee4c4d40706556b5653c78063284557acf138bf1ab4e0dc3bc83f18b002203c3449a83dd03cc2eff8a34d74e5e4d869adf0e9880ee4eea37745c70ae0c6d3012103dd39d15bba279bff1bda974b0eea1f1d7eec3b9cfc36fd3b47620545b1b825f7" }, "sequence":4294967295 } ], "vout":[ { "value":0.139, "n":0, "scriptPubKey":{ "asm":"OP_DUP OP_HASH160 e3bebb5140450dce9e434275c68467ce1b1a1667 OP_EQUALVERIFY OP_CHECKSIG", "hex":"76a914e3bebb5140450dce9e434275c68467ce1b1a166788ac", "reqSigs":1, "type":"pubkeyhash", "addresses":[ "n2HAAsUB9933V75VvH1Rr6zY4tAwHhYk76" ] } }, { "value":0, "n":1, "scriptPubKey":{ "asm":"OP_RETURN 761da27c8722993ed07d6b2020333248a7964907b65a1884b6374be6", "hex":"6a1c761da27c8722993ed07d6b2020333248a7964907b65a1884b6374be6", "type":"nulldata" } } ] }
9.broadcast実行
$ curl -H "Content-Type: application/json" -X POST -d '{"tx": "0100000001e16b8c91ea6da5761285affd02b06d6cd465557a526b67ed853c39631a4b7777000000006a47304402202cf13fcee4c4d40706556b5653c78063284557acf138bf1ab4e0dc3bc83f18b002203c3449a83dd03cc2eff8a34d74e5e4d869adf0e9880ee4eea37745c70ae0c6d3012103dd39d15bba279bff1bda974b0eea1f1d7eec3b9cfc36fd3b47620545b1b825f7ffffffff02e018d400000000001976a914e3bebb5140450dce9e434275c68467ce1b1a166788ac00000000000000001e6a1c761da27c8722993ed07d6b2020333248a7964907b65a1884b6374be600000000"}' https://apitestnet.indiesquare.me/v2/transactions/broadcast { "txid":"b6093ea814127808a4fd2e2176d4dc0a44d7babc171e75362afe7b81153e6853" }
10.Counterparty残高確認
送信先のアドレスの残高をみてみましょう。
curl https://apitestnet.indiesquare.me/v2/addresses/n2HAAsUB9933V75VvH1Rr6zY4tAwHhYk76/balances [ { "token":"BTC", "balance":0.07894375, "unconfirmed_balance":0.139 }, { "token":"XCP", "balance":0, "unconfirmed_balance":1 } ]
unconfirmed_balance = 1 になっていますね。1XCP送信できました。
参考
http://www.binaryhexconverter.com/decimal-to-hex-converter http://www.binaryhexconverter.com/hex-to-decimal-converter