草プログラマー、それはつまり草

CS 会計 司法試験 英語 bitcoin 数学 物理学 などいろいろなことを勉強してます

Bitcoin Base58Checksum について

Mastering Bitcoin の Base58Checksum のコードにわかりやすくコメントを付けました。

#include <bitcoin/bitcoin.hpp>

int main()
{
    // Private secret key.
    bc::ec_secret secret;
    bool success = bc::decode_base16(secret,
        "038109007313a5807b2eccc082c8c3fbb988a973cacf1a7df9ce725c31b14776");
    assert(success);
    // Get public key.
    bc::ec_point public_key = bc::secret_to_public_key(secret);
    std::cout << "Public key: " << bc::encode_hex(public_key) << std::endl;
    
    // SHA256 + ripemd160
    const bc::short_hash hash = bc::bitcoin_short_hash(public_key);

    bc::data_chunk unencoded_address;
    // Reserve 25 bytes
    //   [ version:1バイト ]
    //   [ hash:20バイト = 160ビット(ripemd160) ]
    //   [ checksum:4バイト]
    unencoded_address.reserve(25);
    // Version byte, 0 is normal BTC address (P2PKH).
    unencoded_address.push_back(0);
    // Hash = ripemd160(sha256(public-key))
    bc::extend_data(unencoded_address, hash);
    // Checksum is computed by hashing data, and adding 4 bytes from hash.
    // Checksum sha256(sha256(unencoded_address)) の最初の4バイト
    bc::append_checksum(unencoded_address);
    // Finally we must encode the result in Bitcoin's base58 encoding
    assert(unencoded_address.size() == 25);
    const std::string address = bc::encode_base58(unencoded_address);

    std::cout << "Address: " << address << std::endl;
    return 0;
}

もっと頑張って勉強しないと。

C 配列の要素の入れ替え

ただの入れ替えです。

#include <stdio.h>

#define ASIZE 8

void swap_elements(int array[], int a, int b);
void display_array(int array[]);

main()
{
    int nums[ASIZE] = {1,9,3,6,8,5,11,7};
    
    printf("This is the initial array: \n");
    display_array(nums);
    swap_elements(nums, 2, 5);
    printf("The final array is: \n");
    display_array(nums);
}

void swap_elements(int array[], int a, int b)
{
    int temp;
    
    temp = array[a];
    array[a] = array[b];
    array[b] = temp;
}

void display_array(int array[])
{
    int index;
    for(index=0; index < ASIZE; index++){
        printf("%4d", array[index]);
    }
    printf("\n");
}

C++を真面目に勉強してPythonの簡単さに気づいた話

最近、ずっとC++の勉強していまして、二か月ぶりくらいにPythonに戻ってきてやっとPythonの簡単さに気づきました。

やっぱりPythonやRubyしか実務で使わない人も、一回 C++ をちゃんと勉強すべきですね。

まあもっとも僕の場合は, C++ と Go が実務(?)で使うものなのですが・・・

動的な言語もいいですね。超簡単。

アルゴリズムの勉強も順調ですので、今年中に bitcoin と ethereum のソースコードを理解できるように頑張ります。

pycoin や pybitcointools のようなものを今年作ってみようと思ってます。

オブジェクト指向について

C++の基本的な機能は理解したので、オブジェクト指向のもっと深い理解を得るために、オブジェクト指向入門をよんでます。

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 方法論・実践 (IT Architects' Archiveクラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 方法論・実践 (IT Architects' Archiveクラシックモダン・コンピューティング)

分厚いですが、わかりやすいのでそんなに苦労せずに読めると思います。


最近は、データ構造をある程度理解して、いろいろな概念がわかるようになってきたので、だんだんコードが読めるようになってきました。

もっと勉強しないといけません

Bitcoin CAmount について

ソースコードを読んでいて、CAmount ってなんだったっけ? てよくなるので、メモ

amount.h

#ifndef BITCOIN_AMOUNT_H
#define BITCOIN_AMOUNT_H

#include <stdint.h>

/** Amount in satoshis (Can be negative) */
typedef int64_t CAmount;

// 1BTC = 100000000satoshi
// 1BTC = 1 * COIN
static const CAmount COIN = 100000000; 
static const CAmount CENT = 1000000;   

/** No amount larger than this (in satoshi) is valid.
 *
 * Note that this constant is *not* the total money supply, which in Bitcoin
 * currently happens to be less than 21,000,000 BTC for various reasons, but
 * rather a sanity check. As this sanity check is used by consensus-critical
 * validation code, the exact value of the MAX_MONEY constant is consensus
 * critical; in unusual circumstances like a(nother) overflow bug that allowed
 * for the creation of coins out of thin air modification could lead to a fork.
 * */

// 発行量 の最大量 
static const CAmount MAX_MONEY = 21000000 * COIN;
//  0 <= 発行量 <= MAX_MONEY
inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }

#endif //  BITCOIN_AMOUNT_H

CAmount は int_64_t です。

Bitcoinの総発行量については、以下を参考に。
www.neuralsparrow.com

暗号技術 参考書 まとめ

暗号を学ぶ上で、オススメの書籍をまとめてみます。

暗号技術入門 第3版

暗号技術入門 第3版

暗号技術入門は、暗号技術全般がうまくまとまっていて、非常にオススメです。とりあえず、この本を読めば対称鍵暗号、公開鍵暗号、ハッシュ関数、電子署名からMACまで基礎は理解できると思います。

Javaで作って学ぶ暗号技術 - RSA,AES,SHAの基礎からSSLまで

Javaで作って学ぶ暗号技術 - RSA,AES,SHAの基礎からSSLまで

こちらは、javaで実装しながら理解できます。こちらはARS,SHA2,AESのアルゴリズムがするする理解できます。やはり実際にコードでアルゴリズムを実装するのが、一番いいと思います。

暗号理論と楕円曲線

暗号理論と楕円曲線

  • 作者: 辻井重男,笠原正雄,有田正剛,境隆一,只木孝太郎,趙晋輝,松尾和人
  • 出版社/メーカー: 森北出版
  • 発売日: 2008/08/01
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 11回
  • この商品を含むブログ (1件) を見る

楕円曲線もしっかりと理解しておきましょう。この本は、数式もわかりやすく説明されているので、普通に理解できると思います。

楕円曲線はビットコインでも使われています。

暗号解読〈上〉 (新潮文庫)

暗号解読〈上〉 (新潮文庫)

暗号解読(下)(新潮文庫)

暗号解読(下)(新潮文庫)

名著です。

暗号の歴史がわかります。シーザー暗号から、アントワネットとかいろいろな話が合って面白いです。

読みましょう。



C++ STLの技術書まとめ

C++の基本的な機能をある程度おさえたので、STL、標準テンプレートライブラリ、の勉強も本格的に始めました。

とりあえず、2冊手に入れて、勉強しております。

STL―標準テンプレートライブラリによるC++プログラミング 第2版

STL―標準テンプレートライブラリによるC++プログラミング 第2版

  • 作者: ディビッド・R.マッサー,アトゥルサイニ,ギルマー・J.ダージ,David R. Musser,Atul Saini,Gillmer J. Derge,滝沢徹,牧野祐子
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2001/12
  • メディア: 単行本
  • 購入: 5人 クリック: 74回
  • この商品を含むブログ (18件) を見る

入門としては最適だと思います。この本をやってからeffective STL をやるといいかと。

Effective STL―STLを効果的に使いこなす50の鉄則

Effective STL―STLを効果的に使いこなす50の鉄則

  • 作者: スコットメイヤーズ,Scott Meyers,細谷昭
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2002/01
  • メディア: 単行本
  • 購入: 9人 クリック: 155回
  • この商品を含むブログ (95件) を見る

effective シリーズは手に入るだけ全て読むべきでしょう。


まあC++はある程度理解できてきたので、暗号とP2Pの勉強にシフトしていきたいと思います。

とりあえず,BitcoinとEthereumのソースコードを今年中に理解できるように頑張ります。

Copyright © 2016 へなちょこプログラマー All rights reserved.