Angular, Blockchain, Science とか

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

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]);
}

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クラシックモダン・コンピューティング)

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


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

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