Y

Azure APIコンソールからAPI呼び出し

APIコンソール

APIコンソールを利用することで、APIをブラウザから実行できます。

APIコンソールからAPI呼び出し

1.Azureポータルを開いて、リソースグループをクリック

Microsoft Azure

f:id:yzono:20201108163353p:plain

2. 対象のリソースグループをクリック

f:id:yzono:20201108163409p:plain

3. 対象のインスタンスをクリック

f:id:yzono:20201108163452p:plain

4. 左メニューからキーとエンドポイントをクリック

f:id:yzono:20201108163528p:plain

5. キーをコピー (コピーアイコンをクリック)

f:id:yzono:20201108163559p:plain

6. クイックスタートに戻り、APIコンソールをクリック

f:id:yzono:20201108163622p:plain

7. Japan Eastをクリック

f:id:yzono:20201108163704p:plain

8. Host, Ocp-Apim-Subscription-Key, 画像URLを設定してSendをクリック

f:id:yzono:20201108163721p:plain

画像URLは以下を設定

https://azurecomcdn.azureedge.net/cvt-9281d9db0c63a479d39019e02b1bc35d712622992174d8bb4dcb33f728511a17/images/shared/cognitive-services-demos/face-detection/detection-1-thumbnail.jpg

9. レスポンス確認

f:id:yzono:20201108163753p:plain

Azure Face APIを使うためにリソース作成

Azure Face API

画像内の顔を分析する AI サービス

アプリに顔認識を埋め込んで、高度なセキュリティで保護されたシームレスなユーザー エクスペリエンスを実現できます。

顔認識 | Microsoft Azure

Azure Face APIを使うためにはリソースを作成する必要があります。本記事ではリソースの作り方について書きます。

リソース作成方法

1.Azureポータルを開いて、リソースの作成をクリック

Microsoft Azure

f:id:yzono:20201108122204p:plain

2. AI + Machine Learningをクリック

f:id:yzono:20201108122325p:plain

3. 画面右のFaceをクリック

f:id:yzono:20201108122412p:plain

4. 各設定値を入力

f:id:yzono:20201108122537p:plain

リソースグループ、インスタンスの名前は適当に設定しましたが、推奨される名前付けおよびタグ付け規則があるようです。詳細は下記を見てください。

推奨される名前付けおよびタグ付け規則

5. タグ設定

f:id:yzono:20201108123123p:plain

空欄のまま、「次: 確認および作成 >」をクリック

6. タグ設定

f:id:yzono:20201108123123p:plain

も入力せずに「次: 確認および作成 >」をクリック

7. 作成クリック

f:id:yzono:20201108123355p:plain

8. デプロイ完了

f:id:yzono:20201108124113p:plain

リソースに移動をクリック

9. クイックスタート画面表示

f:id:yzono:20201108123722p:plain

Azureの有料アカウントにサインアップする方法

Azure 無料アカウント

Azure 無料アカウントでは、最初の 30 日間に使用できる 200 ドルの Azure クレジットと 12 か月の無料サービス (数に制限あり) が提供されます。

有効期限内のクレジットがあるか、または無料のサービスを制限の範囲内で使用する限り、料金は請求されません。

クレジットの残高がなくなるか、30 日が経過して有効期限が切れると、ご利用のサブスクリプションとサービスは無効になります。

Azure 無料アカウントでの課金を避ける | Microsoft Docs

有効期限が切れると、サブスクリプションとサービスは無効になるため、意図しない料金が発生することを防ぐことができます。

本記事では、クレジットを使い果たした、または期限切れの場合に、有料のサブスクリプションとサービスに登録する方法について書きます。

Azureアカウント登録方法

1.Azureにログインする

f:id:yzono:20201108113118p:plain

無料アカウントの利用期限が終了したため、有料プランへの移行を求められます。

2. 支払情報を入力

f:id:yzono:20201108113430p:plain

3. テクニカルサポートを追加する

f:id:yzono:20201108113538p:plain

追加する必要がない場合は一番下の選択肢を選びます。

4. アグリーメントにチェックしてサインアップ

f:id:yzono:20201108113819p:plain

参考

Microsoft Azure サブスクリプション新規購入時のサポートプランの選択・購入方法について

Azureアカウント登録方法

Azureアカウントとは

そもそもAzureとは、サーバ・ストレージ・ネットワーク・分析などのサービスを、必要な時に必要な分だけ、インターネットを介してレンタル(利用)することができるクラウドサービスのひとつです。

Azureアカウントとは、こうしたAzureサービスを利用するための権限のことです。このAzureアカウントを取得することで、Azureサービスを利用したり、利用中のサービスを管理したりする「Microsoft Azure Portal」(以下、Azureポータル)にアクセスできるようになります。

https://ascii.jp/elem/000/004/010/4010427/

Azure Cognitive Servicesを利用したい場合、Azureアカウントが必要になります。

Azureアカウント登録方法

1.アカウント作成画面にアクセス

Azure の無料アカウントを今すぐ作成しましょう | Microsoft Azure

2. 画面中央の 「無料で始める」 をクリック

f:id:yzono:20200907133842p:plain

3. 「作成」リンクをクリック

f:id:yzono:20200907134331p:plain

4. メールアドレスを入力して、「次へ」ボタンをクリック

f:id:yzono:20200907134423p:plain

5. パスワードを入力して、「次へ」ボタンをクリック

f:id:yzono:20200907134529p:plain

6. メールアドレスに受信したコードを入力して、「次へ」ボタンをクリック

f:id:yzono:20200907134753p:plain

7. 表示されている文字を入力して、「次へ」ボタンをクリック

f:id:yzono:20200907135243p:plain

8. プロフィールを入力して、「次へ」ボタンをクリック

f:id:yzono:20200907135501p:plain

9. カード情報を入力して、「次へ」ボタンをクリック

f:id:yzono:20200907135622p:plain

10. 規約に同意して、「次へ」ボタンをクリック

f:id:yzono:20200907140217p:plain

11. 「アカウントを設定しています...」と表示されるので、画面が自動で変わるまで待つ

f:id:yzono:20200907140406p:plain

12. 「Azureの利用開始の準備ができました!」と表示されるので、「ポータルに移動」ボタンをクリック

f:id:yzono:20200907140600p:plain

13. ポータルサイトにログインできる

f:id:yzono:20200907141128p:plain

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にアクセス

IBM Cloud - 日本 | IBM

2. 画面右上の 「Cloud登録 / ログイン」 をクリック

f:id:yzono:20200904145005p:plain

3. Eメール、パスワードを入力後、「次へ」ボタンをクリック

f:id:yzono:20200904145212p:plain

4. 検証コード入力後、「次へ」ボタンをクリック

f:id:yzono:20200907105040p:plain

5. 個人情報入力後、「次へ」ボタンをクリック

f:id:yzono:20200904150008p:plain

6. ご利用条件に同意後、「アカウントの作成」ボタンをクリック

f:id:yzono:20200904151134p:plain

ログイン方法

1. IBM Cloudログイン画面にアクセス

IBM Cloud

2. アカウント・プライバシーについて同意後、「次に進む」ボタンをクリック

f:id:yzono:20200904150927p:plain

3. ダッシュボード画面表示

f:id:yzono:20200904151022p:plain

Counterpartyトークンをマルチシグで送受信する

今回やること

  1. APIを使ってマルチシグアドレスにトークンを送る
  2. APIを使ってマルチシグアドレスからトークンを送る
  3. APIを使ってマルチシグアドレス(P2SH)にトークンを送る
  4. 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の送信トランザクションを作ります。

blog.yzono.com

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インストール

$ 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

(5) 送信元アドレスにBitcoinを送付

以下サイトから送信元アドレスを入力するとTestnetで使えるBitcoinがもらえます

http://tpfaucet.appspot.com/

(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
   }
]

(7) 送信元アドレスにXCPを送付 ⭐

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トランザクションサイン

  • デコードした内容を入力

スクリーンショット 2017-02-18 00.34.54.png

  • 送信元アドレスのPrivate Key (WIF) を入力してサインボタンクリック

スクリーンショット 2017-02-18 00.34.18.png

  • Script = Signature + Hash Type<改行>送信元のPublic Key

スクリーンショット 2017-02-18 00.34.36.png

  • txins[0].signature_script = Script.Hex

スクリーンショット 2017-02-18 00.34.03.png

(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になります。

スクリーンショット 2017-02-18 04.02.35.png

(3)Script作成

各データを連携します。

OP_RETURN(6a) + データのバイト数(16,1c) + 暗号化したデータ
6a1c761da27c8722993ed07d6b2020333248a7964907b65a1884b6374be6

4.TXEDITOR (Transactionタブ)を入力

スクリーンショット 2017-02-18 03.49.19.png

5.TXEDITOR (Signature(HASHTYPE_ALL))を入力

スクリーンショット 2017-02-18 03.48.51.png

6.TXEDITOR (Script)を入力

スクリーンショット 2017-02-18 03.48.58.png

7.TXEDITOR (Transactionタブ)を入力

スクリーンショット 2017-02-18 03.48.43.png

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