Develop with pleasure!

福岡でCloudとかBlockchainとか。

Bitcoin

Bitcoinのソフトフォークとして導入するConfidentail Transaction

昨年Bitcoinの開発メーリングリストにポストされたConfidential TransactionをBitcoinのソフトフォークとして導入する話↓ [bitcoin-dev] Confidential Transactions as a soft fork (using segwit) Confidential TransactionについてはBlockstreamが開発した…

Confidential Transactionのrange proofの仕組み

techmedia-think.hatenablog.com ↑でConfidential Transactionのコミットメントの作成と検証をしたので、続いてrange proofについて見てみる。 Confidential Transactionではトランザクションの各出力にコインの量ではなくコミットメント(楕円曲線上の点)…

Confidential Transactionのcommitmentを生成してみる

以前、Confidential Transactionのホワイトペーパーを読んだ↓ techmedia-think.hatenablog.com Confidential Transactionでは、トランザクションの出力にコインの量をセットする代わりに、Pedersen commitmentを楕円曲線に適用したコミットメント(この場合…

ECDSAの脆弱性を利用した未承認トランザクションの二重使用を防止する仕組み

Bitcoinのトランザクションは10分に一度作成されるブロックに取り込まれる。最近のメモリプールの状況では10分後に取り込まれればラッキーな方で、まだ時間がかかることもよくあると思う。 その一方でECサイトや実店舗でのBitcoin決済の導入は進んでいる。リ…

Strong Federationsの概要

Blockstreamが今年に入って公開したStrong Federationsのホワイトペーパーに記載されている技術仕様についてを読んでみた↓ https://arxiv.org/pdf/1612.05491v2.pdf もともとBlockstreamのサイドチェーンのホワイトペーパーのFederated Pegでは、信頼できる…

リプレイ攻撃を防ぐOP_CHECKBLOCKATHEIGHTを定義したBIP-115

EthereumがETHとETCにハードフォークした際に問題となったリプレイ攻撃。 ブロックチェーンでハードフォークが発生すると、ハードフォークの前に持っていた通貨は、分岐した両方のチェーンで有効な状態になる。仮にAコインがハードフォークしてAコイン(元の…

Segwitのアドレスフォーマットを定義したBIP-173

取り下げられたSegwitのアドレスフォーマットを定義したBIP-142↓ techmedia-think.hatenablog.com に変わって、新しい仕様でSegwitのアドレスフォーマットを定義したBIP-173が登録されてたので見てみる↓ bips/bip-0173.mediawiki at master · bitcoin/bips ·…

Standards Track BIPのレイヤーの分類を定義したBIP-123

Standards Track BIPのヘッダの項目の1つにLayerがあるが、このLayerについて定義したのがBIP-123↓ bips/bip-0123.mediawiki at master · bitcoin/bips · GitHub 動機 Bitcoinはさまざまな標準を含むシステムで、そのいくつかは相互運用性を担保するのに必…

メッセージが拒否された理由を明確にするBIP-061

2014年4月にリリースされたBitcoin Core 0.9.0、ネットワークのプロトコルバージョン70002でサポートされたrejectメッセージのBIP↓ bips/bip-0061.mediawiki at master · bitcoin/bips · GitHub リモートピアとメッセージを交換する際、意図する動作になら…

リモートピアのメモリプール内のトランザクション情報を取得できるようにしたBIP-035

2012年の8月に提案されたmempoolメッセージのBIP↓ bips/bip-0035.mediawiki at master · bitcoin/bips · GitHub mempoolメッセージを受け取ったノードはメモリプール内の全トランザクションハッシュを返すようになり、getdataメッセージで取得可能なトランザ…

リモートピアの生存確認とレイテンシーの計測を可能にするBIP-031

2012年5月にリリースされたBitcoin Core 0.6.1から導入されたPeer Serviceレイヤーの拡張で、リモートピアの生存確認と、レイテンシーの測定を可能にするBIP-031↓ bips/bip-0031.mediawiki at master · bitcoin/bips · GitHub 簡単に言うとよくあるping送っ…

ProtocolのバージョンとUser Agentを分離したBIP-014

作られたのは2011年とだいぶ前のBIPだけど、あまりPeer ServiceレイヤーのBIPを見てなかったので見てみる。 昔はプロトコルのバージョンとクライアントのバージョンが同じだったのね。 bips/bip-0014.mediawiki at master · bitcoin/bips · GitHub 動機 Bitc…

Bitcoin Core 0.14.1のリリース

Bitcoin Core 0.14.1のマイナーアップデートがリリースされてたので主な変更内容を見ておく。 bitcoin/release-notes-0.14.1.md at master · bitcoin/bitcoin · GitHub RPCの変更 createrawtransactionの最初の引数がtransactionsからinputsにリネームされた…

署名に厳密なDERエンコーディングを適用したBIP-066

techmedia-think.hatenablog.com でECDSAの署名データの改竄に遭遇したのもあり、関連して現在のBitcoinプロトコルに適用されている署名のエンコーディングルールについて定義したBIP-066の内容もおさえておく。 bips/bip-0066.mediawiki at master · bitcoi…

BIPとして登録されたHTLC(BIP-199)

HTLCの仕様がBIPとして登録されてたので見てみる↓ bips/bip-0199.mediawiki at master · bitcoin/bips · GitHub 概要 Hashed Time-Locked Contract (HTLC) は、あるユーザー間(売り手と買い手)の決済を行うコントラクトで、売り手がハッシュのプリイメージ…

トランザクションのmalleabilityを利用した攻撃を受けた話

最近testnetでブロードキャストしたトランザクションが、消えて無くなる現象が続いたので調べてみた。 消えたといっても実際に消えてるわけではなく、ブロードキャストした際のTXIDとは別のTXIDでブロックに格納されている。 実際にブロードキャストした際の…

Confidential Assetsの概要

Blockstreamが新しくConfidential Assetsなる機能をリリースしていたので、どういったものなのか見てみる。 blockstream.com Open Assets ProtocolやCounterpartyやColuなどBitcoinのブロックチェーン上で、Bitcoin以外のアセットを発行・送付するプロトコル…

Bitcoin Core 0.14.0のリリース

Bitcoin Core 0.14.0がリリースされたのでどんな変更があったのか見ておく↓ Bitcoin Core :: Bitcoin Core 0.14.0 Released with Performance Improvements 主な新機能は↓ IBDのパフォーマンス改善 ブロックチェーンのデータサイズは絶えず増加していて、現…

UTXOのサイズ削減のアプローチTXO Commitments

BitcoinのUTXOのデータサイズは増加する一方で、フルノードを運用する際のボトルネックにもなっているが、そのUTXOの成長の問題を解決する方法としてBitcoinのコア開発者の1人であるPerter Toddが昨年 TXO Commitmentsという仕組みについてブログに投稿して…

BIPについて定義したBIP-002

BIPについて定義していたBIP-001が、2016年11月にBIP-002にリプレースされてたので見とく↓ bips/bip-0002.mediawiki at master · bitcoin/bips · GitHub 概要 BIPはBitcoin Improvement Proposalの略で、Bitcoinコミュニティに情報提供したり、Bitcoinの新し…

Lightning Networkで古いCommitment Txを取り消すRevocation Key

以前、Lightning Networkを構築する際のPayment Channelの仕組みについて書いた↓ techmedia-think.hatenablog.com プリイメージを使ったコミットメントトランザクションの取消 このPayment Chanelを使ったオフチェーンの決済には、悪意あるユーザによって最…

P2WSHを使うトランザクションの作成と署名

P2WPKHの署名方法について書いた↓ので techmedia-think.hatenablog.com 今回はP2WSHの署名について。 単純なマルチシグでもつまならいのでOP_CSVのBIPに出てくるLNのトランザクションサンプルのP2WSHにしてみる↓ https://github.com/bitcoin/bips/blob/maste…

P2WPKHを使うトランザクションの作成と署名

だいぶ前に書き始めて放置してたのでちゃんと実装してみた。 以前↓のようにwitnessなトランザクションのパース方法について書いたので、 techmedia-think.hatenablog.com 続いてwitnessなトランザクションを作ってみる。 P2WPKHにBitcoinを送付 まず最初にP2…

bitcoin-rubyで決定性署名を生成する

bitcoin-rubyのP2PKHの署名のデフォルト実装 bitcoin-rubyを使ってP2PKHのUTXOを入力にしたトランザクションの署名は↓のように書ける。 require 'bitcoin' Bitcoin.network = :testnet prev_key = Bitcoin::Key.from_base58('秘密鍵') prev_tx = Bitcoin::Pr…

決定性辞書式順序ソートによるトランザクションの入出力のソート(BIP-69)

Lightning Networkの仕様の中でトランザクションの入出力のソートについてBIP-69が参照されていたので、どんな仕様なのか見てみる。 bips/bip-0069.mediawiki at master · bitcoin/bips · GitHub 要約 現在、トランザクションの入力と出力の順序について、Bi…

Lightning Networkを使ったクロスチェーン取引

Bitcoin MagazineのLightning Networkを使ったクロスチェーン取引の拡張についての記事が出てた↓ので見てみる。 bitcoinmagazine.com Atomic Swap そもそもBitcoinとアルトコインの相互運用というのは、別に新しいことではなく、2013 年にTier Nolanが紹介し…

HDウォレット(BIP-32)

長編のBIPで斜め読みしてたので、ちゃんと読んでみる。 bips/bip-0032.mediawiki at master · bitcoin/bips · GitHub 概要 このBIPでは階層的決定性ウォレット(HDウォレット)について説明する。 この仕様では、異なるクライアント間で交換可能な決定性ウォ…

Bitcoin Core 0.13.2のリリース

先日Bitcoin Core 0.13.2がリリースされた↓ bitcoincore.org リリースノートは↓ bitcoincore.org 主な変更点 0.13系のマイナーアップデートなので、基本的にはBugfixとパフォーマンス改善のリリースになるので、新機能のリリースは無い。 古いOSをサポート対…

Teechanの決済プロトコル

Bitcoin-NGやCovenantsなどの提案をしているコーネル大学の先生方が先日Teechanというオフチェーン決済のプロトコルに関するブログとホワイトペーパーを公開していたので見てみる↓ hackingdistributed.com https://www.cs.cornell.edu/People/egs/papers/tee…

Federated Pegのアドレス導出スキーム

Blockstreamが公開しているSidechainのホワイトペーパーのAppendixにFederated Pegを行う際のP2SHアドレスの導出スキームが定義されている。このFederated Pegの仕組みは同じくBlockstreamが公開しているサイドチェーンの実装Elements Alphaでも利用されてい…

楕円曲線を使ったゼロ知識証明

↓のゼロ知識証明の解説記事に掲載されている楕円曲線を使ったゼロ知識証明をbitcoin-rubyを使って検証してみた。 www.atmarkit.co.jp 検証手順は↑のの記事の通りで、 証明者(アリス)と検証者がいて、楕円曲線上の点Pとアリスの秘密鍵aがあるとき、その公開…

Rubyで楕円曲線の鍵共有(ECDH)と加算

Bitcoinで使われる楕円曲線の鍵について、bitcoin-rubyを使って鍵交換(ECDH)と楕円曲線の加算をしてみる。 鍵共有(ECDH) アリスとボブが持つ鍵を使って共通鍵を生成してみる。 アリスとボブはそれぞれお互いの公開鍵を知っており、秘密鍵をそれぞれa、b…

Elementsで実装されているOP_CHECKSIGFROMSTACKを使ったCovenants

Scaling Bitcoinのセッションで提案されていた、Bitcoinの秘密鍵が例え盗まれても、Bitcoin自体が盗まれないようにするCovenantsを使った金庫についてブログを書いた↓けど、 techmedia-think.hatenablog.com このアプローチとは別に、Blockstreamが提供する…

Bitcoinの使われ方を制限することで盗難を防ぐCovenants

ミラノで開催されたScaling Bitcoinのセッションの1つだったCovenantsについてホワイトペーパーが公開されてたので見てみた。 http://fc16.ifca.ai/bitcoin/papers/MES16.pdf ※ ↑の論文は特にBIPにもなっている訳でもないので、今後Bitcoinのスクリプトシス…

Pay-to-contract プロトコル

サイドチェーンElements AlphaでBitcoinのブロックチェーンとサイドチェーン間で資金を移動する際に使われているPay-to-contractと呼ばれるプロトコルについてざっとホワイトペーパー読んでみた。 https://arxiv.org/pdf/1212.3257.pdf Pay-to-contractプロ…

Elements AlphaにおけるFederated Pegの仕組み

Blockstreamが開発しているサイドチェーン実装のElementsで実装されているFederated Pegの技術的な仕組みが↓で公開されてたので見てみる。(記事自体は2016/02/29に書かれたもの) The Federated Peg in Elements Alpha — The Elements Project メインチェー…

Segwitのアップグレードガイド

mainnetへのSegwitデプロイを有効にするBitcoin Core 0.13.1がリリースされ、それに合わせてSegwitをサポートしたい人、したくない人向けにアップグレードガイドも公開されてたので見てみる↓ malleabilityの問題や署名の前後でtxidが変わらないのはコントラ…

マルチシグ検証の際のmalleabilityを解消するNULLDUMMYルール(BIP-147)

Segwitと一緒にデプロイされるBIP-147を見てみる。 bips/bip-0147.mediawiki at master · bitcoin/bips · GitHub このBIPでは、OP_CHECKMULTISIGやOP_CHECKMULTISIGVERIFYで使われる余計なスタック要素を使ったmalleabilityを解消するため、Bitcoinのトラン…

witnessデータを含むブロックのwitness rootとcommitment hashの計算

Segwitの導入にあたってブロック作成時にwitness トランザクションの署名が確かにブロックに含まれていることを保証するために新しいCommitment構造が導入されている。 techmedia-think.hatenablog.com コインベーストランザクションに追加されたCommitment…

Asset Definition URLをP2SHのredeem scriptに設定する

Open Assets Protocolではアセットのメタデータを定義したAsset DefinitionをURLで指定する。 techmedia-think.hatenablog.com ↑に記載されているように、Asset Definition URLとブロックチェーン上のアセットを紐付ける方法は以下の2種類がある。 アセット…

マークル化抽象構文木(BIP-114)

Segwitで導入されたwitness programを使った拡張で、マークル化抽象構文木 = Merkelized Abstract Syntax Trees(MAST)という仕組みがBIP-114として定義されている。 bips/bip-0114.mediawiki at master · bitcoin/bips · GitHub 多数の異なる条件を持つBit…

Clion(gdb)を使ってbitcoindをデバッグ

bitcoindの挙動を追いたくなり、gdbを使ってデバッグしてみる。ただ、コマンドベースでブレークポイント貼ったり変数確認したりするのはシンドイので、Clionが2016.2からサポートしたgdbのRemote Debug↓を利用する。 CLion 2016.2 EAP: Remote GDB debug | C…

Segwit導入におけるRPCの主要な変更点

techmedia-think.hatenablog.com 先月リリースされたBitcoin Core 0.13.0にSegwitのコードがマージされtestnetで利用可能になったので、関連するRPCの変更点を見てみる。 RPCの変更点 getblock と getblockheader の変更点 出力内容に新しく以下の項目が追加…

Segwitなトランザクションをパースしてみる

witnessなトランザクション用にBIP-144で新しいシリアライゼーションフォーマットが定義された↓ techmedia-think.hatenablog.com ので実際にそのフォーマットに従ってトランザクションをパースしてみた。 フォーマットの変更点 詳細はBIP-144に定義されてい…

bitcoin-rubyを使ったマルチシグアドレスの作成と署名

bitcoin-rubyを使ってマルチシグの作成とマルチシグでロックされたUTXOへの署名をする。 他の言語のライブラリもそうだけど、bitcoin-rubyもBitcoin::ScriptクラスでP2SHを使ったマルチシグアドレスの作成と署名をサポートしている。 マルチシグアドレスの作…

Bitcoin支払いのURIスキーム(BIP-21)

Mastering Bitcoinの2章でカフェのレジでBitcoinを使った支払いをする際に生成されていたQRコードがBIP-21の仕様で作られているみたいなので、BIP-21の内容を見てみる。 bips/bip-0021.mediawiki at master · bitcoin/bips · GitHub BIP-21は、Webサイト上…

getblockchaininfoで確認するBIP-9によるソフトフォークの状況

先日、segwitがtestnetで実行できるようになったBitcoin Core 0.13.0がリリースされた。 このソフトフォークのデプロイは、BIP-9で定義されたversion bitsを利用している。 techmedia-think.hatenablog.com このソフトフォークの状況はgetblockchaininfoとい…

Bitcoin Core 0.13.0の主な機能

Bitcoin Core 0.13.0がリリースされた。 Bitcoin Core :: Bitcoin Core 0.13.0 Released! Bitcoin Coreのブログより、主な新機能は↓ segregated witnessの準備 0.13.0で一番重要なコードの変更で、今後のソフトフォームに向けてsegwitのコードが含まれている…

双方向Payment ChannelでのHTLCsの利用

techmedia-think.hatenablog.com techmedia-think.hatenablog.com と続いて最後の第3部では、オフチェーンである双方向Payment ChannelでどうやってHTLCsを使った取引を行うかという点について解説されてる↓ bitcoinmagazine.com Lightning Network 前回ま…

HTLCsを利用した中間者を経由するBitcoinの支払い

前回の双方向Payment Channel↓に続いて、Bitcoin MagazineのLightning Network記事の第二弾であるHTLCsを使ったネットワークの作成部分についてみてみる。 techmedia-think.hatenablog.com bitcoinmagazine.com ネットワーク 前回の記事でアリスとボブの間で…