Develop with pleasure!

福岡でCloudとかBlockchainとか。

Bitcoin

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 ネットワーク 前回の記事でアリスとボブの間で…

OP_CSVで指定期間まで資金を凍結

以前、絶対時間を使用するOP_CLTV(BIP-65)で指定期間まで資金をロックするスクリプトを作成したので↓ techmedia-think.hatenablog.com 今回は、相対時間を使用するOP_CSV(BIP-112)↓を使って同様のことをやってみる。 techmedia-think.hatenablog.com OP_…

双方向のPayment Channelの仕組み

Bitcoin MagazineのLightning Networkの記事をベースに双方向Payment Channelの仕組みについて理解する。 bitcoinmagazine.com 双方向Payment Channelの構成要素 unconfirmed transaction 最初のCommitment Transactionを作成する際、入力となるOpening Tran…

bitcoinjのmicropayment channelの実装

bitcoinjでは0.10からClient/Server形式のpayment channelをサポートしているみたいなので、どういったものなのか見てみる。 Working with micropayment channels Protocol overview ベースとなってるBitcoin wikiの記事 https://en.bitcoin.it/wiki/Contrac…

Open Assets Protocolを使ったアセットのAtomic Swap

Open Assets Protocolのアセットを1トランザクションで交換するAtomic Swapをやってみた。 シナリオ アリスはアセットID”oQWgTxFmK2EAYuoDvs2bLPNo9MG5nXnmyM”のアセットを1,000個持っている。 ボブはアセットID”oM4p6N7CqTTcujSHkiRKXzzVcMuXek8aiz”のアセ…

Segwitにおける新しいメッセージとシリアライズフォーマットの仕様(BIP-144)

segwitに対応したトランザクション及びブロックを伝搬させる際の新しいメッセージやシリアライズフォーマットについて定義したBIP-144を見てみる。 bips/bip-0144.mediawiki at master · bitcoin/bips · GitHub 動機 BIP-141でsegwitのコンセンサスが定義さ…

version 0 のwitness programで導入される新しい署名検証の仕組み(BIP-143)

Segwitのデプロイも近づいてきたので、version 0のwitness programにおける署名の検証のための新しいトランザクションのダイジェストアルゴリズムについて定義するBIP-143について調べてみる。 bips/bip-0143.mediawiki at master · bitcoin/bips · GitHub …

Block受信時に重複したトランザクションの受信を抑制するCompact Block(BIP-152)

BIPに登場してからマージ&デプロイまで結構なスピード感で導入されたBIP-152。 フルノードでは、ブロードキャストされたトランザクションの受信と、マイニングされたブロック受信時にブロック内に含まれるトランザクションとで、同じトランザクションの情報…

version bitsを利用したソフトフォークのデプロイに対するマイナーの対応とISMによるソフトフォークとの違い

BIP-9として定義されているBitcoinのソフトフォークのデプロイメントプロセス techmedia-think.hatenablog.com に関して、Bitcoin Coreのブログにマイナー向けのQ&Aが掲載されて具体例を交えてマイナーがどう対応すればいいのか記載されてたので見てみる。 B…

Bitcoinネットワークのピア間の通信の暗号化(BIP-151)

Bitcoinネットワークのピア間の通信を暗号化するBIP-151の提案が出てたので見てみる。 bips/bip-0151.mediawiki at master · bitcoin/bips · GitHub 動機 Bitcoinネットワークでは現在ピア間の通信を暗号化していないため、(トラフィックの操作のような)セ…

CHECKLOCKTIMEVERIFYで指定期間まで資金を凍結

techmedia-think.hatenablog.com ↑のCHECKLOCKTIMEVERIFYを使って、指定した期間まで出力を凍結するトランザクションを作ってみた。 資金凍結をするスクリプト 実際に作成したのは↓のScript <expiry time> CHECKLOCKTIMEVERIFY DROP <pubkey> EQUALVERIFY CHECKSIG expiry timeに</pubkey></expiry>…

トランザクション署名時のSIGHASH

Bitcoinのトランザクションに署名する際の、署名のスコープの仕様について読んでみる。 SIGHASHの種類 https://bitcoin.org/en/developer-guide#signature-hash-types OP_CHECKSIGが各署名から非スタック引数を抽出し評価することで、署名者はトランザクショ…

トランザクションのシリアライズフォーマット仕様

シリアライズされたBitcoinのトランザクションのフォーマット仕様について、いつもライブラリ任せだったのでちゃんと仕様を読む。 https://bitcoin.org/en/developer-reference#raw-transaction-format フォーマット仕様 バイト数 名前 データタイプ 定義 4 …

relative lock-timeをスクリプトで検証するOP_CSV(BIP-112)

BIP-112にはCHECKSEQUENCEVERIFYという命令コードが定義されており、BIP-68と組み合わせることで、出力の年齢に基づいた制限を加えることができるようになる。bips/bip-0112.mediawiki at master · bitcoin/bips · GitHub 概要 CHECKSEQUENCEVERIFYは既存のN…

複数のソフトフォークの並行デプロイを可能にするversion bits(BIP-9)

先日Bitcoin Coreの0.12.1がリリースされた。 Bitcoin Core :: Bitcoin Core 0.12.1 Released! このリリースでBIP-68、BIP-112、BIP-113のソフトフォークがリリースされることになったが、このソフトフォークのリリースで初めてversion bitsを利用したデプロ…

コインベースのフォーマット仕様

Bitcoinではブロックをマイニングするとその報酬が得られるが、この報酬を受け取るトランザクションをコインベーストランザクションと呼ぶ。 通常のBitcoinの取引では入力となるトランザクションは別のトランザクションの出力を参照する形式になるが、コイン…

ブロックのバージョンをアップグレードする際のルール(BIP-34)

BIP-9のversion bitsを読んでるとBIP-34が関連してたのでまずはこっちを見てみる。 bips/bip-0034.mediawiki at master · bitcoin/bips · GitHub Bitcoinのブロックやトランザクションはバイナリ構造をバージョン管理されていて、現在のバージョン(このBIP…

ロックタイムの比較の際に使われるMedian time-past(BIP-113)

BIP-68のRelative lock-time等である一定期間ロックされたトランザクションをブロックに入れていいか判断する際の考え方を再定義するのがBIP-113になる。 https://github.com/bitcoin/bips/blob/master/bip-0113.mediawiki 動機 現状、現在の時刻もしくはブ…

CHECKLOCKTIMEVERIFY使った有効期限付きトランザクション(BIP-65)

BIP-65で定義されているOP_CHECKLOCKTIMEVERIFYは、トランザクションの出力を将来のある時点までunspendableのままにする(要は指定された時間まで使えないUTXO)命令コードについて定義している。 bips/bip-0065.mediawiki at master · bitcoin/bips · GitH…

シーケンス番号を使ったRelative lock-timeについて(BIP-68)

BitcoinのトランザクションにはnLockTimeというパラメータがあり、nLockTimeで指定した時刻が過ぎるまではそのトランザクションはブロックに入れられないよう制限ができる。nLockTimeはトランザクションに1つしか設定できないけど、このnLockTimeを相対的に…

Opt-in Replace-by-Feeによるトランザクションの置換(BIP-125)

Bitcoinをやりとりする際にネックになるのが、ブロードキャストしたトランザクションがブロックに入るまでの待ち時間。通常、10分くらいすれば入るのだけど、トランザクションの優先度によっては、いつまで経ってもなかなかブロック入らないケースもある。…

Bitcoin Core 0.12.0の追加機能

先月Bitcoin Coreの0.12.0がリリースされてる。 Bitcoin Core :: Bitcoin Core 0.12.0 Released! 追加機能 署名の検証が7倍高速に Bitcion CoreではOpenSSLを使って楕円曲線暗号の署名の検証をしていたけどこの部分を3年前から作り始めたlibsecp256k1に置き…

Segwitのアドレスフォーマット(BIP-142)

Segregated WitnessのアドレスフォーマットについてBIP-142に定義されてるので見てみる。 bips/bip-0142.mediawiki at master · bitcoin/bips · GitHub 仕様 新しく定義されたBitcoinアドレスは、BIP-141のSegregated Witnessで定義されているPay-to-Witness…

Segwitのテスト環境”segnet”に接続

techmedia-think.hatenablog.com4月に導入が予定されている↑のSegwitのテスト環境であるsegnetが2015年12月末にデプロイされているので、試しに接続してみた。 segnet環境のビルド 現在公開されているBitcoin Coreでは当然ながらsegnetには接続できないので…

Segregated Witnessの仕様(BIP-141)

Bitcoinのスケーラビリティの問題への対応の1つとして、トランザクションの情報から署名(Witness)を分離(Segregate)する”Segregated Witness”という提案がされており、この導入によりトランザクション容量の削減が期待されている。 実際に”Segregated W…

BIP-37 Connection Bloom filtering(訳)

Bitcoinのフルノードは、Blockchainの全情報を保持するため、そのデータ量は50GB以上になる。サーバ等であればまぁ問題になるようなレベルの量ではないけど、スマホやIoTデバイスといったリソースにはそれだけの量のデータを保存することはできない。そのた…

Open Assets Protocolのアセットをburn(焼却)する

Open Assets Protocolを利用することで、Blockchain上で任意のアセットの発行・送付が可能になるが、ユースケースとしてアセットの流通の他にアセットの消滅というユースケースも考えられる。Open Assets Protocolをアセットを消滅させるには以下のような方…

MultiChainにおけるネイティブアセット

MultiChainではBitcoinのネットワークと同様のレベルでアセットの発行をサポートしてるみたいなので、ドキュメント読んで見る。Native assets in MultiChain | MultiChain MultiChainのアセット MultiChainはBlockchainレベルでネイティブにアセットをサポー…

複数のアセットを1トランザクションで送付できるようになったopenassets-ruby v0.2.9をリリース

Open Assets Protocolのカラーリングは、order-based coloringという方式を採用しており、トランザクションの入力に色(Asset ID)の異なるアセットが含まれていても、出力で指定されたアドレスにそれぞれ指定した量ずつアセットを送付することができる。複…

Colored Coins ProtocolのAsset IDの算出方法

Asset ID · Colored-Coins/Colored-Coins-Protocol-Specification Wiki · GitHubAsset IDはアセットを一意に識別するイミュータブルなID。Colored Coins ProtocolのAsset IDにはlockedとunlockedという2種類のAsset IDがある。 Unlocked Asset IDs Unlocked…

Colored Coins ProtocolのメタデータのRulesについて

techmedia-think.hatenablog.com で出てきたColored Coins Protocolのメタデータに定義できるRulesについて。Rules · Colored-Coins/Colored-Coins-Protocol-Specification Wiki · GitHub Rules メタデータに定義されているRulesは、Colored Coins Protocol…

Colored Coins ProtocolのメタデータのStatic Dataについて

techmedia-think.hatenablog.comで出てきたColored Coins Protocolのメタデータに定義できるStatic Dataについて。Static Data · Colored-Coins/Colored-Coins-Protocol-Specification Wiki · GitHub Static Data メタデータには静的なデータを含めることが…

Colored Coins Protocolのメタデータのハンドリング方法

techmedia-think.hatenablog.comに続いて、Colored Coins Protocolでのメタデータのハンドリング方法について見てみる。github.comColored Coins Protocolでは任意の色付けされた取引(発行もしくは転送)へメタデータを追加できる。メタデータはプレーンなJ…

dumpprivkeyで取得した秘密鍵から公開鍵を生成

bitcoin-rubyを使ってBitcoin Coreのウォレットで管理している秘密鍵からから公開鍵を作成する手順。 dumpprivkeyの戻り値 最初、Bitcoin Coreのdumpprivkeyコマンドで秘密鍵を入手できるので、その秘密鍵から公開鍵を再作成するだけと思い、bitcoin-rubyを…

Open Assets Payment Method Protocolの仕様(訳)

ちょっと時間が経ったけど、Open Assets Extensions to Payment Requestsにおけるアセットの交渉に関するプロトコルを定義したドキュメントが公開されてたのでざっと訳してみる。github.comざっくり言うと、支払い方法(どんなアセットでどんな量の支払いが…

Bitcoinの匿名性を向上させるConfidential Transactions

Bitcoin単体には個人を表すデータは存在しないけど、アドレス間の送金のやりとりや、取引所を介した現金化などのデータから必ずしも個人が特定できないということは無い。 Bitcoinのアドレスと組織・個人が結びつくと、例えばAという会社はどれくらいの売上…