Pebble Coding

プログラマーの作業メモ

macOS nokogiri がインストールに失敗する時の対応

macOS nokogiriのインストールに失敗するときの対応。 macOS 10.13.3 $ brew install libxml2 $ brew link --force libxml2

ruby rcdsa gemを用いたsecp256k1の鍵ペア生成

$ irb irb(main):001:0> require 'ecdsa' => true irb(main):002:0> require 'securerandom' => true irb(main):003:0> group = ECDSA::Group::Secp256k1 => #<ECDSA::Group:secp256k1> 法素数 irb(main):005:0> group.field.prime => 115792089237316195423570985008687907853269984</ecdsa::group:secp256k1>…

ruby製bitcoinツールのインストール

$ sudo gem install bitcoin-ruby $ sudo gem install openassets-ruby $ sudo gem install ecdsa

bitcoin-cli コマンドまとめ その1

Original Bitcoin client/API calls list - Bitcoin Wiki コネクション数表示 bitcoin-cli getconnectioncount 8 コネクション情報表示 bitcoin-cli getpeerinfo [ { "id": 8, "addr": "35.187.63.250:18333", "addrlocal": "103.5.140.142:61962", "addrbin…

macos環境でbitcoinフルノード をソースからビルドする(version 0.16 2018-03-25)

macos環境でbitcoinフルノードをソースからビルドします。 以下の手順通りでOKです。 https://github.com/bitcoin/bitcoin/blob/master/doc/build-osx.md $ brew install automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf python…

ECDSA(楕円曲線デジタル署名アルゴリズム)の概要

ECDSA(Elliptic Curve Digital Signature Algorithm)の概要です。 要点だけをまとめ、異例のチェックや楕円曲線上の点であるかどうかなどの細かな点は省きます。 正確な仕様は以下です。 AMERICAN NATIONAL STANDARD X9.62-1998 Public Key Cryptography For…

コミットメントスキーム(=ビットコミットメント)

コミットメントスキームの概念を理解するために、まず、コイン投げプロトコルを考えます。 Alice,Bobの2人が同じ場所に居合わせ、Aliceがコインを投げ、Bobが表が出るか裏が出るかを当て、勝敗を決めるゲームを考えます。 このゲームの手順のことをプロトコ…

JSONRPC をpython で体験する

RPC(リモートプロシージャコール)とはRESTと同じような、 特定フォーマットのHTTPリクエストを受け取り、レスポンスを返すプロトコルの一種です。 フォーマットには XML, JSON, protocol buffer, messagepack などあります。 最後の2つはバイナリフォーマッ…

ビットコインにおけるブルームフィルターとマークルツリーパス

現時点(2018年2月)において2009年から作られたビットコインのブロックの数(=ブロック高)は、 こちら Bitcoinブロックエクスプローラ - ブロックチェーン をみるとわかるように、 508786 です。 最新の4つのブロックを見ると、一つのブロックには、200 ~ 160…

2017年買ってよかったモノベスト3

2017年買ってよかったモノベスト3です。 第3位 MacBookPro 2017 13inch www.apple.com 今まで、iOSアプリ開発用には MacBook Air を使っていましたが、Storyboardを開くのにメモリ不足で、 きつくなってきていたので、入手を決めました。 Storyboardを開く…

クラウドマイニング HashFlare で SHA256 (BTC) にいくらか突っ込んでみた(2018年2月)

クラウドマイニングやってみたいなーという簡単な気持ちで、HashFlare のSHA256 (BTC) に少額を突っ込んでみました。 HashFlareはスコットランドの会社らしいです。 メリット、デメリット マイニング機材の購入維持、マシンの騒音を気にする必要がないという…

Monacoin を MacBook Pro で CPU マイニングできるか試してみた

この記事は2018-1-28時点のものです。備忘録として手順を残しておきます。 マシン: MacBook Pro 2017 モナコインのウォレットをダウンロード Monacoin project ここからmacOSX版のウォレットをダウンロードします。 立ち上げると全トランザクションのダウン…

Crypto Currency(仮想通貨) リスト

Crypto Currencyの公開されているソースリポジトリと実装言語をまとめてみました。(2017年12月) ついでに、githubで管理されているものはissueの数を数えて見ました。 ご指摘ありましたら教えていただけると助かります。 Bitcoin(BTC or XBT) 承認時間: 10 …

secp256k1における体演算の最適化

secp256k1の体演算の最適化手法として、x,yが法素数q未満であることと256bit値の範囲内であることを用いて、 256bitサイズの値を9個の26bit値と1つの22bitの値(9*26+22=256bit)に分割する手法があります。 法素数q=0x FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF F…

secp256k1における逆数計算

secp256k1における逆数つまり1/aの計算方法を解説します。 法素数qに対して、が1/aとなります。 なぜなら 最後の等号は、フェルマーの小定理を使っています。 やることはaをq-2回ベキ乗することです。 pythonでq-2を2進表現してみましょう。 >>> q = 2 ** 25…

平方剰余とは

平方剰余 http://nakano.math.gakushuin.ac.jp/~shin/html-files/Algebra_Introduction/2011/11.pdf について簡単に説明しておきます。 整数aと整数pを与えた時に の式を満たす解xは存在する場合と、存在しない場合があります。 解が存在する時、a は p を法…

secp256k1における平方剰余計算

secp256k1における平方剰余計算を考えてみます。 secp256k1の法素数 はこの形をみてわかる通り、なので、 この記事mod p での平方剰余を計算する(p mod 4 = 3の場合) - Pebble Coding で示したように、解は と書けます。 コンピュータで計算する場合は、次の…

素体Fp上の楕円曲線 y^2 = x^3 + D の有理点の数

の素体上の有理点の数を調べます。 楕円曲線Eの有理点の数を#Eと書きます。 素数pを3で割って2余る場合は、有理点の数は無限遠点を含み、#E= p + 1 であることが知られています。 の場合の、有理点の数をpythonで調べた結果がこちらです。 p, p mod 3, #E 2,…

素体Fpの乗法群

素体は体であり、元は{0, 1, ..., p-1}のp個あります。 素体という時、pは素数です。 体なので、加法と乗法について閉じているわけですが、乗法演算の部分のみを取り出した群のことを、 素体の乗法群と呼びと書きます。 この乗法群には加法の単位元0は含まれ…

群論における写像

群論における写像の定義メモ。 準同型写像、同型写像、自己同型写像。 写像というのはプログラムで考えると、引数を一つ入力として持ち、戻り値を一つ返す関数だとイメージすることができますが、 要するに関数f(x)のことです。 準同型写像 関数f(x)が f(x)f…

Bitcoin フルノードを立てるのに必要なもの

Bitcoin フルノードを立てるのに必要なものをメモしておきます。 最低限必要なスペック 最新バージョンのWindows, Mac OS X, Linuxが動作するするハードウェア 145GB の空きディスクスペース 2GBメモリ 400Kbpsのアップロードスピードの通信回線 高いアップ…

Objective-Cとswift3 で NSView* を void* に変換してまたNSView*に戻す

NSView をvoidに変換するのはObjective-Cですが、これはキャストするだけです。 - (void)convert:(NSView*)view { void* ptr = (void*)view; } void*はswiftではUnsafeMutableRawPointerと表現されます。 func convert(p:UnsafeMutablePointer) { let view:N…

ビットコインで使われている楕円暗号 secp256k1 をpythonで実装してopensslで確認してみる

ビットコインで使われている楕円暗号 secp256k1 をpythonで実装してみます。 なお、動作確認にはopensslを用います。 こちら secp256k1仕様 - Pebble Coding で示したように、計算効率を考えなければpythonで実装するのは割と容易です。 #!/usr/bin/env pyth…

楕円関数の加法公式

楕円関数 の形式の加法公式をメモしておきます。 アフィン座標での加算公式 1) PとQが同一点の場合。 2) の場合 これをアフィン座標(affine coordinate)と呼びます。 素体 上の割り算は掛け算に比べて10倍〜50倍くらいの計算量なので、 割り算の回数を減らす…

secp256k1仕様

secp256k1に関するメモです。 後ろから二番目のkは数学者Neal Koblitzのkらしいです。 曲線 法素数 = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F = 11579208923731619542357098500868790785326998466564056403945758400790…

swift で 実用に耐えうる ed25519 を実装してみる

前回は、swiftでed25519を実装しましたが、愚直なアルゴリズムで遅いので実用に耐えうるものではありませんでした。 今回は、実用に耐えうるアルゴリズムで実装しました。 github.com 実質、SUPERCOP https://bench.cr.yp.to/supercop.html によるC言語実装…

Xcode で Module 'xxx' was not compiled for testing メッセージが出た時の対処法

Xcode で Module 'xxx' was not compiled for testing メッセージが出た時の対処法です。 リリースビルドで単体テストを実行しようとすると発生します。 Enable Testability を Yes に変更すればOKです。

ed25519をswiftで実装してみる

ed25519をswiftで実装してみます。 pythonのリファレンス実装 https://ed25519.cr.yp.to/software.html をそのままswiftに置き換えただけのものです。 ソースはこちら。 github.com swiftには標準ライブラリにBigInt実装がありませんので、pure swift で実装…

ed25519のpython実装を紐解く その3 暗号編テスト

ed25519のpython実装を紐解く 暗号編 その1(キーペア生成からベリファイまで) - Pebble Coding リファレンス実装では、sign.inputというファイルの中に:区切りでの 秘密鍵,公開鍵,メッセージ,署名+メッセージのセットがhex表示で1024個入っています。 例と…

ビットコインでは楕円曲線暗号secp256k1が使われている

どうやらビットコインでは署名に楕円曲線暗号が使われているらしいです。 ビットコインは楕円曲線暗号の勉強を始める何年も前から所有していますが、知らなかった。 楕円曲線暗号というのはRSA暗号と同じ非対称型の暗号で秘密鍵と公開鍵のペアからなります。…