Category Archives: ビットコイン

ビットコイン ブロックチェーン プログラミング

Ledger Nanoの受取アドレスを生成するプログラムを作った

Published by:

朝からこんな怖い話がニュースになっていました・・・!

レッジャー社のハードウェアウォレットに脆弱性 「中間者攻撃」で資金流出リスク

 レッジャー社がツイッターで参照する匿名レポートによると、マルウェアに感染したパソコンを使ってレッジャー中にビットコイン受取アドレスを生成しようとする際、「中間者攻撃」とよばれるセキュリティ侵害が起こる可能性がある。マルウェアがアドレス生成のためのコードを改編し全ての入金がハッカーに送られてしまうという。

普通のディスプレイ付きLedger Nanoであればこのサイトで紹介されている方法でアドレスが正しいかどうかを判定できますが、私が持っている古いディスプレイなしのタイプでは確認できません。

というわけで確認用のツールを作ってみました。

Ledger wallet address checker
http://hello.lumiere-couleur.com/app/browser_ledger/

browser_ledger

サーバー生成ではありませんので、ネットワークを切断した状態でも使えます。
というか、そのように使った方がいいかと思います。

TypeScript+Browserify+jQueryで作りましたが、意外に簡単なんですね。
ちょっとしたツールだったら、これからこの方法で行こうかな。

Github リポジトリはこちら

ビットコイン ブロックチェーン プログラミング 発表、ニュース

ビットコインのウォレットと、支払い用のプログラムを作ろう

Published by:

ビットコインのウォレットは数多くありますが、ハードウェアウォレットは高いしなあ・・・という方は、とりあえずウォレットアプリを利用するのがおすすめです。
ウォレットアプリだと、スマホが壊れたときや新しいスマホに買い替えたときに大事なビットコインがなくなっちゃうんじゃない?なんて心配になりますが、大丈夫!
すべてのビットコインはブロックチェーン上に保管されていて、そのブロックチェーンは世界中に遍在しています。

ハードウェアウォレットだろうとペーパーウォレットだろうと、もちろんウォレットアプリも同じですが、すべてその中にビットコインはありません!
これらウォレットはブロックチェーンに保管されているビットコインへの鍵のようなもので、仮にウォレットがぶっ壊れてもビットコインが失われたわけではなく、合鍵を使ってアクセスすればいいのです。

合鍵となるのがリカバリーフレーズですが、最初にウォレットを作るときに必ずメモを残すようにしましょう。
また、このリカバリーフレーズさえあればだれでもそのウォレットへアクセスできますので、十分気をつけて保管して下さい。

私が使っているCopayというウォレットアプリでは、12の日本語の単語(ひらがな)でリカバリーフレーズが作れます。
仮に私がCopayでウォレットを1つ作り、そのリカバリーフレーズを人にあげれば、それはそのまま相手のウォレットにもなっちゃいます。
この仕組み、本当に面白いですよね・・・

最近個人的に作っているプログラムでビットコインの支払いを受け付ける必要があったのですが、HDウォレット形式に対応することで毎回支払いのビットコインアドレスを変えることが出来ます。
こうすることでちゃんと支払われたかどうかをプログラムでチェックできるのでおすすめです。
1つのアドレスに全部送ってもらうようにすると、どれが誰のものか分からなくなってしまうんですよね。

下はTypeScript版のコードですが、これで新しい受取用のアドレスを生成することが出来ます。
Wallet.tsの「const mnemonic = ‘リカバリーフレーズ’;」のところに、Copayで生成したウォレットのリカバリーフレーズを入れます。

import bitcoin = require('bitcoinjs-lib');
import bip39 = require('bip39');

const mnemonicToM = (mnemonic, password, network) => {
    const seed = bip39.mnemonicToSeed(mnemonic, password || "")
    const m = bitcoin.HDNode.fromSeedBuffer(seed, bitcoin.networks[network || "bitcoin"])
    return m
}
const mnemonic = 'リカバリーフレーズ';

/**
 *  ビットコインウォレット
 */
export class Wallet {
  /**
   *  支払い用アドレス生成
   */
  public static createPaymentAddress(tx_index: number) {
    const m = mnemonicToM(mnemonic, '', 'bitcoin');  // 秘密鍵
    // console.log(m.derivePath("m/44'/0'/0'").toBase58()); // xpriv...
    // console.log(m.derivePath("m/44'/0'/0'").neutered().toBase58());  // xpub...
    // console.log(m.derivePath("m/44'/0'/0'/0/0").getAddress()); // 1DQ...

    let paymentAddress = m.derivePath("m/44'/0'/0'/0/" + tx_index).getAddress();
    return paymentAddress;
  }
}

次に、受取チェックのプログラム。

import blockexplorer = require('blockchain.info/blockexplorer');
import rp = require('request-promise-native');

import { BitcoinAddress } from "./BitcoinAddress";
import { BitcoinTransaction } from "./BitcoinTransaction";

/**
 *  ビットコイントランザクション
 */
export class Transaction {
  /**
   *  最新のブロック総数を取得
   */
  public static getBlockCount(): Promise<number> {
    let url = 'https://blockchain.info/ja/q/getblockcount';
    return rp(url)
      .then((body: string) => {
        let count = parseInt(body.trim());
        if (isNaN(count)) {
          return -1;
        }
        return count;
      });
  }

  /**
   *  指定のアドレスの情報を取得
   */
  public static getAddress(address): Promise<BitcoinAddress> {
    // 最新のブロック総数を取得
    return Transaction.getBlockCount()
      .then((count: number) => {
        // アドレス情報を取得
        return blockexplorer.getAddress(address)
          .then((result) => {
            let bitcoinAddress = new BitcoinAddress();
            bitcoinAddress.address = address;
            bitcoinAddress.total_received = result.total_received / 100000000;
            bitcoinAddress.last_confirmation = 0;
            bitcoinAddress.txs = [];

            // トランザクションの承認数を確認
            if (result.txs && result.txs.length > 0) {
              for (let i = 0; i < result.txs.length; i++) {
                let tx = result.txs[i];
                let bitcoinTransaction = new BitcoinTransaction();
                bitcoinTransaction.block_height = tx.block_height ? tx.block_height : count;
                bitcoinTransaction.confirmation = Math.max(0, count - tx.block_height);
                bitcoinTransaction.confirmation = !isNaN(bitcoinTransaction.confirmation) ? bitcoinTransaction.confirmation : 0;
                if (bitcoinAddress.last_confirmation == 0) {
                  bitcoinAddress.last_confirmation = bitcoinTransaction.confirmation;
                } else {
                  bitcoinAddress.last_confirmation = Math.min(bitcoinAddress.last_confirmation, bitcoinTransaction.confirmation);
                }
                bitcoinTransaction.btc_amount = 0;
                for (let j = 0; j < tx.out.length; j++) {
                  let out = tx.out[j];
                  if (out.addr == address) {
                    bitcoinTransaction.btc_amount += out.value / 100000000;
                  }
                }
                bitcoinAddress.txs.push(bitcoinTransaction);
              }
            }

            return bitcoinAddress;
          });
      });
  }
}
import { BitcoinTransaction } from "./BitcoinTransaction";

/**
 *  ビットコインアドレス
 */
 export class BitcoinAddress {
   public address: string;
   public total_received: number;
   public last_confirmation: number;
   public txs: BitcoinTransaction[];
 }
/**
 *  ビットコイントランザクション
 */
 export class BitcoinTransaction {
   public block_height: number;
   public confirmation: number;
   public btc_amount: number;
 }

実行するとこんな感じです。

import { BitcoinAddress } from "bitcoin/BitcoinAddress";
import { Transaction } from "bitcoin/Transaction";
import { Wallet } from "bitcoin/Wallet";

// tx_indexは0スタートのインクリメント値
let paymentAddress = Wallet.createPaymentAddress(0);
console.log('paymentAddress', paymentAddress);

Transaction.getAddress(paymentAddress)
  .then((bitcoinAddress: BitcoinAddress) => {
    console.log('bitcoinAddress', bitcoinAddress);
  });

$ npm run wallet_test 

> myprogram@1.0.0 wallet_test /home/xxxxxxxxx/myprogram
> env NODE_PATH=./build node ./build/wallet_test.js

paymentAddress 1rUTG3jWJ3rkEiKFLyvXbMaQcLnqxr49c
bitcoinAddress BitcoinAddress {
  address: '1rUTG3jWJ3rkEiKFLyvXbMaQcLnqxr49c',
  total_received: 0.0104252,
  last_confirmation: 1508,
  txs: 
   [ BitcoinTransaction {
       block_height: 492652,
       confirmation: 1508,
       btc_amount: 0.0104252 } ] }

生成された支払い法のアドレス(上の実行例では1rUTG3jWJ3rkEiKFLyvXbMaQcLnqxr49c)が、Copayで表示される受取用アドレスと一致してればOK。
または、Copayの設定画面で確認できる、ウォレットの拡張公開鍵と、Wallet.tsでコメントアウトしている「// console.log(m.derivePath(“m/44’/0’/0′”).neutered().toBase58()); // xpub…」のコメントを外して実行してみて、その出力結果が一致しているかどうかも確認した方がいいでしょう。

ソースのダウンロードはこちら

ビットコイン ブロックチェーン

Ledger NanoでSegwitに切り替えたら残高なくなってて焦った

Published by:

ビットコインを受け取ろうと、ハードウェアウォレットのLedger Nano(過去の記事「ビットコインを普通のお財布に入れてみた」)をPCに挿したところ、Segwit対応のファームウェアにアップデートできるとのことで、アップデートしました。
いったん全部消してリカバリーするのでドキドキするのですが、8月のビットコインキャッシュ誕生の時にも一度やっていたので同じようにアップデートしました。

アップデート後にLedger Nanoを挿し直して、Segwit切り替えの確認画面が出たのでSegwitを選んだところ、残高が 0 BTCになってる!?
確認画面をよく見たらアドレスが変わるので、旧ウォレットから新ウォレットへ送金しないといけないそう。
設定画面から旧ウォレットに戻して新ウォレットのアドレスへ全額送信して、ちゃんと移動できました。
あ~、びっくりした。

Segwitへの切替画面。 後からいつでもスイッチ可能です。

Segwitへの切替画面。
後からいつでもスイッチ可能です。

SETTINGSの右下のBLOCKCHAINSをクリック

SETTINGSの右下のBLOCKCHAINSをクリック

BITCOINを選択して、次の画面(最初の写真と同じ)でLEGACYをクリックすると旧ウォレットが開きます。

BITCOINを選択して、次の画面(最初の写真と同じ)でLEGACYをクリックすると旧ウォレットが開きます。

旧ウォレットから新ウォレットへ全額移動。焦らせるぜ・・・

旧ウォレットから新ウォレットへ全額移動。焦らせるぜ・・・

Ledger Nanoは品切れで、より高機能なLedger Nano Sも売ってるけど、高い・・・。
見た目もLedger Nanoの方が好きなんだけどな。

ビットコイン ブロックチェーン

インターネットはcopy、ブロックチェーンはmove

Published by:

ブロックチェーンやビットコインについての記事を度々見かけるようになりましたが、技術的な説明が全面に出てきてしまうので、結局何?という感じの人が多いのではないでしょうか。

一昨日の朝日新聞にもブロックチェーンの記事があり、最近読んだ中では一番分かりやすかったのですが、横からのぞき込んできた小学三年生の息子に「ブロックチェーンって何?」とシンプルに質問されて、思わずたじろいでしまいました。

その時は「インターネットは調べ物をしたりするときに使うけど、ブロックチェーンはいろんなものを交換するのに使うんだよ」と答えましたが、頭のなかでは何かうまく言えてないなあと息子の問いが残ったままになっていました。

あれから考え続けてやっと一つ分かりやすい言い回しを思いついたのが、タイトルの「インターネットはcopy、ブロックチェーンはmove」です。

インターネットブラウザで「ソースを見る」をしたことがある人は、最初びっくりしたのではないでしょうか。
どこかのWebサイトのページを表示して、「ソースを見る(Ctrl-U)」でHTMLソースを表示して、ブラウザによっては編集も出来て、しかも編集した内容がブラウザにも反映されてしまうと、もしかしてハッキングしちゃった??なんてドキドキしたりして。

実際はブラウザで表示しているのは、Webサイトのサーバーに置いてある実体のコピーなので、サーバーの元ファイルを書き換えることは出来ません。
私も昔、そこでやっとインターネットの仕組みについて理解しました(なーんだコピーを見てるんだー)。

ブロックチェーンは問答無用でmove(移動)します。
地上波放送の「ダビング10(9回まではDVDにコピーできるけど、10回目は元ファイルが消えてしまう仕組み)」の最後のムーブだけみたいな感じです。

オンライン銀行取引なんかでmove(振込)出来るよ?と思われる方もいるでしょうが、あれは銀行内部の取引をインターネットを介して依頼しているだけで、仕組み自体は疑似moveといったところです。

インターネットは商取引やデータのやり取りに長けていますが、実はmoveが超苦手で、どんどんコピーばかりを作ってしまいます。
なので、著作物の違法コピーや違法ダウンロードは、法律で取り締まるしか対応策がありません。

ブロックチェーンはインターネットに新しく取り付けられたmove機能と言ってもいいかもしれません。
コピーされては困るもの、お金や著作物、株式・債権や契約書、プライバシーに関わるものなど、これまでインターネットでのやり取りをしようと思ったら信頼できる第三者を経由しなくてはいけませんでしたが、これからは直接当人同士がオンラインでやり取りできるようになるというものです。

ちなみに、開発者にとってはブロックチェーンは勉強しがいのあるテーマです。
ブラウザプログラムのソースは超巨大で、Chromiumの場合ソースコードをリポジトリからダウンロードすると数TBにもなりますが、ビットコイン・コアのソースはzipでダウンロードすると8MBしかなく、一つ一つのソースを簡単に見ることが出来ます。
いつか自分もブロックチェーン・プログラムを書いてみたい!

ビットコイン

読んで楽しい「ビットコインとブロックチェーン – 暗号通貨を支える技術」

Published by:

51njhwzbjjl-_sx393_bo1204203200_

技術書でこんなに楽しいと感じたのは、そうとう久々です。
いやでも、これはわくわくせざるを得ませんよ!

特に面白いと感じた箇所をダイジェストで書いてみたいと思います。

ビットコインを送る/受け取る

ジョーのウォレットは、ジョーの資金から0.10 bitcoinをアリスのアドレスに送るというトランザクションを生成し、ジョーの秘密鍵で署名します。
(中略)
peer-to-peerプロトコルにより、このトランザクションの情報はビットコインネットワーク上に素早く伝搬されます。
ネットワーク上で密に繋がったノードのほとんどが、このトランザクションを1秒以内に受け取り、アリスのアドレスを初めて認識します。

ビットコインを送る際は、送り先のアドレス(ビットコインアドレス)を先方から受け取ります。
ビットコインアドレスは1から始まるアルファベット+数字の組み合わせ文字で、やり取りするたびに新しいアドレスを使います

何度かビットコインを移動したり支払いすると分かりますが、「払ったよ」→「受け取ったよ」はメールの送受信と同じくらいの早さで実行されます

「ビットコインは遅い」という話を以前読んだ覚えがあるのですが、トランザクションそのものはあっという間に伝わっています。

ただ、そのトランザクションがブロックチェーンと呼ばれる共有元帳に取り込まれ、その後10分毎の承認を3回とか6回繰り返さないと受け付けませんという「方針」の受取者の場合には時間がかかるということです。

今まで試したところでは承認回数=3回のところが多かったので、20分~30分くらいはかかることになります。

公共料金の支払いなどでは困りませんが、美容室やカフェでビットコイン支払いする場合はそんなに待てません。

そんな少額決済の場合は、トランザクション通知を受けた時点で受け付けるような方針になるでしょうね。

ビットコイントランザクションに関するよくある誤解は、「承認」のために新しいブロックが生成されるまで10分間待たなければならないとか、完全な6回の承認のために60分間待たなければならないといったことです。
承認は、トランザクションがビットコインネットワーク全体に受け入れられたことを保証しますが、このように待つことはコーヒー一杯のような少額の商品には必要ありません。
店舗側は、承認がない場合でも、いつも彼らが受け入れている個人IDや署名がないクレジットカードよりリスクが大きくないなら、有効な少額のトランザクションを受け入れるでしょう。

なぜ「承認」が必要かというと、同じビットコインアドレスを同時に二重使用した場合に、決済後に片方がキャンセルされる可能性があるためです。

二重使用は技術的に(今のところ)難しい手法のため、頻繁に発生するとは思えませんが、今後簡単に起こすツールなんかが出ないとも限りません。

高額のやり取りの場合は気をつけないとだめですね。

1ビットコイン=ン万円なのに、どうやって支払うの?

正直に言いますと、つい最近まで私も、1ビットコイン=1ビットコインアドレスだとすると、どうやって支払いに使うの?なんて素朴に思っていました。

ビットコインのやり取りの最小単位は 1/100,000,000 ビットコインで、ビットコイン考案者のナカモト・サトシ氏にちなんで「1 satoshi」と呼ばれています。
1ビットコイン=6万円とすると、1 satoshi=0.0006円なので、少額決済ももちろん可能なんですね。

じゃあビットコインアドレスって何?となりますが、これは支払い時のワンタイム・アドレスのようなもので、トランザクションを識別するためにつけているだけのものです。

ですので、ウォレット(お財布)にビットコインが 1 ビットコインありますという時にも、実際は受け取りトランザクションの合計値を表示していて、例えば 0.1 受け取りビットコイン+0.5 受け取りビットコイン+0.4 受け取りビットコインのトランザクションをウォレットがかき集めて足し算して表示してくれてるんです。

ちなみに一回のやり取りごとに一定の手数料(今は3~5円くらい)を払う必要がありますが、これは決済会社がマージンとして取っているわけではなく、マイナー(マイニングを行っている人々)への報酬として使われています。

マイニングってどんな計算を行ってるの?

ビットコインはマイニング(採掘)という操作を行ってはじめて発行されます。

これもこの本を読むまでは、何か特殊な数学的な計算を専用コンピュータに行わせて、その解を得た人がビットコインを貰えると思っていました。

大体この通りとも言えるのですが、実際はビットコインのやり取り(トランザクション)をブロックに詰め込んで、共有元帳に加えていいか、検証する操作を行っています。

ビットコインネットワークに送られたトランザクションは、グローバルに分散した元帳であるブロックチェーンの一分となるまでは、検証されたことになりません。
平均して10分ごとに、マイナーはブロックチェーンに取り込まれていないトランザクションを含むブロックを生成します。
新しいトランザクションは、ウォレットやその他のソフトウェアから常にビットコインネットワークに流れ込みます。
ビットコインネットワークのノードがこの新しいトランザクションを見つけると、各ノード中にある、未検証のトランザクションを一時的にとどめておくトランザクションプールに加えます。
マイナーは新しいブロックを作るとき、未検証のトランザクションをこのプールから取り出して新しいブロックに追加します。
その上で、新しいブロックの有効性を証明するために(proof of workとして知られる)非常に難しい問題を解きます。

単に無意味な計算を行っているわけではなく、ビットコインネットワークの基本となる共有元帳(ブロックチェーン)を成り立たせるという、大事な役割を担ってるんですね。

プールに貯まっているトランザクションのうち、頭から数百件をかき集めて一つのブロックにまとめ、そのブロックのハッシュ値がある決められた値になるよう計算し、最初に計算した人が各トランザクションに含まれている手数料を受け取ることが出来ます。

また、この人はこの手数料とは別に、新規に発行されたビットコイン(2016年10月時点で12.5ビットコイン。時間とともに報酬金は減っていく)を受け取ります。

ちょっとマイニングを試してみたいなという人は諦めたほうがいいです。
特殊な専用ハードウェア+専用環境をそろえないと、まるで徒労に終わります。

その他気になるキーワード

ビットコインクライアント・・・ビットコインコアと呼ばれる、ビットコインシステムのすべての機能を実装しているクライアントです。インストールして実行すると、数日がかりで元帳をダウンロード&同期します。

楕円曲線暗号・・・ビットコインで使っている公開鍵などを生成するために使いますが、ものすごい詳しく書かれています。読むと頭が良くなったように感じます。

階層的決定性ウォレット・・・ビットコインのやり取りに使うビットコインアドレスですが、一つのルートキーからツリー構造で生成することが出来ます。元となるキーは秘密のままに、子キーだけを人に渡して支払い操作をしてもらうなんてことが可能です。

Proof-Of-Workアルゴリズム・・・マイニングで行っている「特殊な計算」が何をしているのか、詳細にわかりやすく説明してくれています。これも一度読むと人に教えたくなります。

ブロックチェーンフォーク・・・全世界で同時にマイナーが競い合っているブロックチェーン作りですが、同時に別のブロックが承認されたらどうなるの?という、ある意味ブロックチェーンの肝とも言える部分は、けっこう最後の最後でやっと教えてくれます。読んですっきり!

ハードウェア ビットコイン プログラミング

ビットコインを普通のお財布に入れてみた

Published by:

ハードウェアウォレット Ledger Nano

ハードウェアウォレット Ledger Nano

ビットコインを買ってみたい、でも以前ハックされたMt.Gox(マウント・ゴックス)のことを思うとオンラインウォレットに購入したビットコインを置いておくのは怖い。

投資目的ではなく、単に買ってみたい、持ってみたい、使ってみたいというだけなので、Ledger Nanoというハードウェア・ウォレットを購入してみました。

2014年2月にMt.Goxがハック&破綻する数週間前にもビットコインを買ってみようと思い、まさにそのMt.Goxにアカウントを作ったところでしたが、結局買えずじまいで2年以上経ってしまいました。

そのころは1BTC=8万円くらいで2015年は2~3万円、2016年9月の今は5万円~6万円くらいと大きく変動するビットコインですが、今回はcoincheck(コインチェック)という日本の取引所でごく少額を購入してみました。

coincheckで、0.1ビットコインを購入するところ

coincheckで、0.1ビットコインを購入するところ

購入したビットコインをそのままcoincheck(コインチェック)のオンライン・ウォレットに保管しておいても問題ない(はず)ですが、手元のLedger Nanoに移しておくことでオンライン上でハックされる恐れがなくなります。

スマホアプリやPCアプリにもウォレットはありますし、そちらの方が使い勝手は良いと思いますが、仮想通貨がリアルに手に持てるというのはちょっと面白い感覚ですよね。

ハードウェア・ウォレットへのビットコインの出し入れは、PCのUSBポートにさして専用アプリを経由して行います。
その際は4桁のPINコードとセキュリティカードが必要です。
(ハードウェアを紛失したりコードがわからなくなった時や、新しいハードウェアへ移すときなどにもリカバリーできるそうです)

Ledger Wallet Nanoのセキュリティーカード。 裏に換字コードが書かれています。

Ledger Wallet Nanoのセキュリティーカード。
裏に換字コードが書かれています。

実際のビットコインのやり取りにかかる時間ですが、最初の一回だけ4~5分待った気がします。
その後は数十秒で終わりましたので、思っていたよりずっとスピーディに出し入れできるんですね。

これまでオンライン決済には、クレジットカードや銀行振込を使っていて、最近はそれほど手間に感じることなく買い物出来ていましたが、銀行やクレジットカード会社のサーバーを一切介さず、これだけスマートに直接お互いやり取りできるというのは、とてつもない進化です。

ほんのわずかのビットコインを買ってみただけですが、この技術の桁違いの新規性に冷や汗をかきました。
正直ブロックチェーン技術についてはまだまだプログラマーとして無知な状態ですが、今後理解を深めておかないとまずいよなあ。

coincheck(コインチェック)はこちら ↓。画面の作りが使いやすいです。

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

ビットコイン

Braveブラウザのビットコイン寄付機能で、OrcaLabにドネーション

Published by:

広告ブロックブラウザ「Brave」、好きなサイトにビットコインで寄付が可能に
 Eich氏は、「ウェブサイトに自動で少額を寄付したいが、そのために何百または何千ものサイトにクレジットカードを登録するのは嫌だ、という意見が寄せられている。Brave Paymentsは、そうした人々に対するわれわれの提案だ」と述べた。ただし、取引を完了するためには、ウェブパブリッシャーは認証を通して寄付金を受け取らなければならない。そして、広告をブロックするBraveのやり方を快く思っていない一部のウェブパブリッシャーは、同社に協力しないと表明している。
http://japan.cnet.com/news/service/35088517/より

前々から好きなサイトに気軽に寄付ができたらいいのにと思っていましたが、ついにブラウザでそれが可能になったとのニュース。

Braveというブラウザは何となくしか知りませんでしたが、早速インストールして試してみました。

ブラウザのダウンロードはこちら

インストールして支払い設定を行います。

ペイメント機能をONに

ペイメント機能をONに

送金ボタンをクリック

送金ボタンをクリック

ビットコインウォレットからお支払い。 私の場合、Ledger Nanoというハードウェアウォレットから送信しました。

ビットコインウォレットからお支払い。
私の場合、Ledger Nanoというハードウェアウォレットから送信しました。

数分で入金されました。 手数料は数円でこのスピード。ビットコインやばい。

数分で入金されました。
手数料は数円でこのスピード。ビットコインやばい。

で、さっそく寄付したいサイトを開いてみます。
今回はOrcaLabという野生のシャチ(オルカ)の映像・音声ライブを公開しているサイトです。

oracalab

以前は http://www.orca-live.net/ というURLで株式会社NTTデータと協力運営していましたが、現在は http://explore.org/live-cams/player/orcalab-base というサイトで活動を続けています。

このサイトを開いても、メニューバーなどに寄付のボタンなんか表示されないぞ・・・と思っていたら、Braveのペイメント設定に自動で追加されていました。
ブックマークするしないに関わらず、ページを開けばそのドメインが追加されるようです。

Oracalab関連のサイトが追加されていました。

Oracalab関連のサイトが追加されていました。

デフォルト「含める」でサイト追加されるので、気をつけないと寄付したくないところにもドネーションされてしまうかもしれませんが、そのサイトを閲覧したということはちょっとはお世話になっているわけなので、こだわらなくてもいいのかもしれません。

サポートしたいサイトを閲覧するときはBraveで見るようにしようかな。