BitcoinのDusting Attack(ダスティング アタック)とは
自分のBitcoinの口座(ウォレットアドレス)に 0.00000546 BTC(今なら40円ほど) の謎の入金があったりします。
これ、実はダスティングアタックというものなんです。解説していきます。
Bitcoinトランザクションの基本
自分が1 BTC持っていて、他人に0.3 BTC送るという取引(トランザクション)があり、送金手数料は0.004 BTCだったとします。
この時Bitcoinのトランザクションは
入力:自分のウォレット (1BTC)
出力:他人のウォレット (0.3BTC)
自分のウォレット (0.696 BTC, お釣り)
となります。入力と出力はバランスしていませんね。入力が 1BTC、出力は 0.996 BTC(=0.3+0.696)となっています。
足りない出力の0.004が手数料となり、マイナーの報酬となります。
これが基本形となります。
実際のトランザクションでは自分のウォレット=ウォレットアドレスであり、公開鍵を加工した16進数文字列となっています。また、ウォレットアドレスはいくらでも自由に作ることができます。お釣り用のウォレットアドレスを入力のものと違うアドレスにして匿名性をあげることができ、これが推奨されていたりします。
以上を踏まえ、実際のトランザクションに近い形にします。
入力:bc1qqm...wtyy (1BTC)
出力:bc1qp5...p422 (0.3BTC)
bc1qrm...jsj7 (0.696 BTC)
このトランザクションを見て、「0.3 BTC他人に支払う」という前提を知らなかったとしたら、出力のどちらが自分のウォレットアドレスで、他人のアドレスかわかりますか?
わからないんです。
どちらも自分のアドレスかもしれないし、どちらも他人のアドレスかもしれません。
これで匿名化の話につながります。
ダスティングアタック
ある人の資産を把握したい。しかしお釣り用のアドレスが入力のアドレスと異なる場合は把握できないというのは上で述べたとおり。ではどうするか?「印」をつけます。
以下のトランザクションを見てください。入力に0.00000546 BTCという中途半端な小さな値をつけています。
入力:bc1qqm...wtyy (1.00000546 BTC)
出力:bc1qp5...p422 (0.3BTC)
bc1qrm...jsj7 (0.69600546 BTC)
この出力のどちらがお釣り用の「自分のウォレット」でしょう?かなりの確率で0.69600546 BTCの方でしょう。0.00000546 BTCという中途半端な端数の支払いってないでしょうからね。
この端数が「ダスト(ごみ)」と言われるものです。
例えばある芸能人がBitcoinで寄付を募るため、自分のウォレットアドレスを公開していたとします。この芸能人はどんなBitcoinの使い方をするんだろう?と興味が湧いた人が、寄付用のアドレスに ダスト(0.00000546 BTC)を送ります。そのあとはブロックチェーンでこのダストがどのように動くかを観察し、この芸能人に紐づくウォレットアドレスを割り出し、金(Bitcoin)の流れを分析することができるようになります。
これがダスティングアタックです。
人のプライバシーに手を入れる類の攻撃です。
対策は、端数のみ入れるウォレットを用意しておく。って感じでしょうか。
知らない人からダストが送られて来たらこのような意図があるということを知っておきましょう。
なぜ 0.00000546 BTCなのか?
1 BTC = 1 億 satoshi(サトシ)です。 1 satoshi = 10^-8 BTC(10の-8乗BTC、1億分の1 BTC)
0.00000546 BTC = 546 satoshi です。
なぜ 546 satoshi なのか?
Bitcoinのコードの中で「ダスト」はdustRelayFeeで定義されていて、単位はsatoshis-per-kilobyteです。トランザクションのデータサイズ(バイト数)でfee(手数料, satoshi)を計算します。
トランザクションの中で、出力の価値よりも多くの手数料を支払うのであれば、その出力はダストと読んでいます。
一番簡単なトランザクションは1つの入力、1つの出力です。この時(非SegWitの時)、入力(CTxIn)の最小値は148Byte、出力(txout)は34Byteです。足すと182Byte。
デフォルトのレート3,000 satoshis/KB (=3 satoshis/Byte)なので、3 * 182 = 546 satoshis となります。
と、いうことでBitcoinのコード的に出力できる最小の値が 546 satoshisなのです。
ダスティングアタックの場合、ウォレットに印をつけるのが目的なので546 satoshiである必要はなく、別に893 satoshiでも構いません。
結論
誰か私のウォレットに546 BTC送ってくれないかなぁ。。
参考
Bitcoinの単位の解説です。なぜ satoshi って変な単位なのか?ダストについても触れています。
ダスティングアタックについての解説です(英語)
Bitcoinのコード上でのダストの扱いについてです。(英語)