Angular, Blockchain, Science とか

Angular, Blockchain, Science全般 の情報を主に書いていきます。

proof-of-work のpython スクリプト

Mastering Bitcoinの proof-of-work アルゴリズムのPythonスクリプトにコメントをつけてみました。

特に難しくはないですね。

import hashlib 
import time

max_nonce = 2 ** 32 # 4 billion

def proof_of_work(header, difficulty_bits):
    
    # target は difficulty target のこと
    # target = 0x10000000000...の場合
    # 0x1000000000... より小さい値のハッシュが見つかるまで
    # nonce をループさせる
    target = 2 ** (256 - difficulty_bits)
    
    for nonce in xrange(max_nonce):
        hash_result = hashlib.sha256(str(header)+str(nonce)).hexdigest()
        
        if long(hash_result, 16) < target:
            print "Success with nonce %d" % nonce
            print "Hash is %s" % hash_result
            return (hash_result, nonce)
        
    print "Failed after %d (max_nonce) tries" % nonce
    return nonce

#if __name__ == '__main__': 今回はrepl.itで実行してるので省略 

nonce = 0
hash_result = ''

# difficulty が高くなるほどマイニングに時間がかかる=難しくなる
for difficulty_bits in xrange(32):
    difficulty = 2 ** difficulty_bits
    print "Difficuty: %ld (%d bits)" % (difficulty, difficulty_bits)
    print "starting search..."
    
    # マイニングにかかるスピードを計る
    start_time = time.time()
    
    # new_blockがheaderになる header + nonce でハッシュをとる
    new_block = 'test block with transactions' + hash_result
    
    # proof-of-work 実行
    (hash_result, nonce) = proof_of_work(new_block, difficulty_bits)
    
    end_time = time.time()
    elapsed_time = end_time - start_time
    
    # マイニング時間表示
    print "Elapsed Time : %.4f seconds" % elapsed_time
    
    # nonce を マイニングにかかった時間で割ったのがハッシュパワー
    if elapsed_time > 0:
        hash_power = float(long(nonce)/elapsed_time)
        print "Hashing Power: %ld hashes per second" % hash_power

正規表現 の勉強を開始

いままで正規表現を避けて生きてきたのですが、正規表現もそろそろちゃんと勉強しなくちゃいけないなあと思いまして、正規表現の勉強も始めました。

とりあえず、オライリーの

詳説 正規表現 第3版

詳説 正規表現 第3版

  • 作者: Jeffrey E.F. Friedl,株式会社ロングテール,長尾高弘
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/04/26
  • メディア: 大型本
  • 購入: 24人 クリック: 754回
  • この商品を含むブログ (87件) を見る

で勉強しています。

まだまだ全然コード書けませんが、今後もあきらめずに勉強を続けていきたいと思います。

それとプログラミング言語の勉強ばかりしてきたので、ソフトウェア開発全般の勉強もちゃんと始めようと思います。

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 FALSE 0
#define TRUE 1
#define ASIZE 8

void display_array(int array[]);
void find(int array[], int value);
int search(int array[], int item);

main()
{
    int nums[ASIZE] = {1,34,54,22,46,75,2,25};
    
    printf("This is the initial array: \n");
    display_array(nums);
    find(nums, 7);
    find(nums, 46);
}

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

void find(int array[], int value)
{
    int where;
    printf("The value %d was", value);
    where = search(array, value);
    if (where == -1)
        printf("not ");
    printf("found in the array ");
    if(where != -1)
        printf("at index %d", where);
    printf("\n");
}

int search(int array[], int item)
{
    int index;
    int found;
    
    found=FALSE;
    index=0;
    while((index<ASIZE) && !found)
    {
        if(array[index] == item)
            found = TRUE;
        else
            index++;
    }
    if (found)
        return index;
    else
        return -1;
}

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 最小値の探索

ただの最小値の探索です。

#include <stdio.h>

#define maxnumber 10

int minimum(int user_array[]);

main()
{
    int number[maxnumber];
    int index;
    
    printf("Give me nine numbers and I\'ll print them backwards \n");
    
    for(index=0; index<maxnumber; ++index)
    {
        printf("Number[%d] = ", index);
        scanf("%d", &number[index]);
    }
    
    printf("Thank you... \n");
    
    printf("Minimum number is %d\n", minimum(number));
}

int minimum(int user_array[])
{
    int index;
    int minimum;
    
    minimum = user_array[0];
    for(index=1; index<maxnumber; index++){
        if(user_array[index] < minimum){
            minimum = user_array[index];
        }
    }
    return minimum;
}

配列の並べ替え

ただの並べ替えです。 reverse です。

#include <stdio.h>

#define maxnumber 10

void run_backwards(int user_array[]);

main()
{
    int number[maxnumber];
    int index;
    
    printf("Give me nine numbers and I\'ll print them backwards \n");
    
    for(index=0; index<maxnumber; ++index)
    {
        printf("Number[%d] = ", index);
        scanf("%d", &number[index]);
    }
    
    printf("Thank you... \n");
    
    run_backwards(number);
}

void run_backwards(int user_array[])
{
    int index;
    printf("\n Here are the numbers oiu entered displayed\n");
    printf("in the reverse order of entry:\n");
    
    for(index=maxnumber-1; index>=0; index--)
        printf("number[%d] = %d\n", index, user_array[index]);
}