python bitcoin generate private key, public key, address

python3 產生 private key, public key, address 的方法

下載下面頁面的 version1 and base58 simple implementation

./version1.py
ECDSA private key (random number / secret exponent) = 76da5d6400314dce18cb5a33b50d2280ba09f479cb34d34d2787416cc923a241
ECDSA public key = 04c1234b372e4b43da2a5e9fbf6a9b093bbb36ae237917e4a4455ec7fab5402ac14a5421cab40ddfda95c9472cfac07097317f032e19a201b204e7d2b805e1c0aa
Bitcoin private key (Base58Check) = 5JidXCmtnPDXdiThrs6Voyz97as9u7pEjmnDQ636uWN5n1EwAEn
Bitcoin Address: 1EDKHefCoBHS5sHuoNtBTk5kXwc3bn78ix (length=34)

 

python2 產生 private key, public key, address的方法

https://davanum.wordpress.com/2014/03/17/generating-a-bitcoin-private-key-and-address/

順便筆記一下安裝python2 相關 module 的方法

sudo apt-get install python-pip
sudo python2 -m pip install --upgrade pip
sudo python2 -m pip install ecdsa

python3 會錯誤在

  1. print格式錯誤,這個好改
  2. os.urandom(32) 回傳的是 byte 格式,沒有 decode method 可以用,這個還不知道怎麼辦

merge mining, 什麼是 merge mining

http://bitcoin.stackexchange.com/a/1288/33824

Basically the idea is that you assemble a Namecoin block and hash it, and then insert that hash into a Bitcoin block. Now when you solve the Bitcoin block at a difficulty level greater to or equal to the Namecoin difficulty level, it will be proof that that amount of work has been done for the Namecoin block. The Namecoin protocol has been altered to accept a Bitcoin block (solved at or above the Namecoin difficulty level) containing a hash of a Namecoin block as proof of work for the Namecoin block. The Bitcoin block will only be acceptable to the Bitcoin network if it is at the difficulty of the Bitcoin network

簡言之就是,把 Namecoin 的 block hash 插入到 blockchain ,當 blockchain 找到了 nonce ,並且難度高於或等於 Namecoin 的難度,則 Namecoin 有設計成當做 Namecoin block 也得到的相同算力保護。其實 merge mining 只有計算 bitcoin block,並沒有計算 Namecoin block

bigchainDB, 什麼是 bigchainDB

仿照 blockchain 做出來的其他染色幣,都是在 blockchain 的基礎上去提昇運行效能, bigchainDB 用另一種方式做,先基於一個分散式資料庫系統,然後再把 blockchain 的特性加上去!

bigchaindb.png

透過API 來使用 BigchainDB 會像是使用一個本地端的資料庫,BigchainDB 實際上是由兩個分散式資料庫組成,一個分散式資料庫用來存放 transaction ,稱之為 backlog 或簡稱 S,另一個分散式資料庫用來存放 block chain,簡稱為 C 。也就是透過 python API 來操作這兩個 RethinkDB ,以達到同時具有分散式資料庫和 blockchain 的特性。在 S 跟 C 之間的合作方式稱之為 BigchainDB Consensus Algorithm (BCA) 。

一筆交易進來的時候會先放進 S 這個分散式資料庫,然後由各個 signing node 將投票將 block 標示為 valid or invalid,如果 signing node 驗證 block 的時候發現到了 invalid transaction,就會投票 invalid,如果沒有發現 invalid transaction,就投票 valid ,所謂的 invalid 例如是 double spending,或者hash id 錯誤,所以這個投票操作就類似 blockchain 的mining 。每一個 block 一開始狀態是 undecided,當多數valid 或者多數invalid 決定之後,就會把 block 標示為 decided_valid or decided_invalid。每一個 block 生成當下會紀錄 voter ,也就是目前可以投票的 signing node 有哪些,所以才有辦法判斷所謂的多數 valid or invalid。當一個 block 得到多數valid 就串到 C 這個分散式資料庫上面,串上去就不能更改了,(這邊完成 blockchain 特性)

signing node 投票的時候要遵守的條件有二

  1. 所有之前的 block 都不為 undecide
  2. block 內的交易都是 valid

交易是 BigchainDB 裡面最基本的紀錄,主要有下面兩種

  1. creation transactions
    1. 包括這是什麼資產
    2. 哪些人是原始擁有者
    3. 做資產轉移時必須滿足的條件
  2. transfer transactions
    1. 把資產轉移給新的擁有者
    2. 設定新的轉移時必須滿足的條件

transaction內容如下

{
" id " : " < hash of transaction , excluding signatures > " ,
" version " : " < version number of the transaction model > " ,
" transaction " : {
" fulfillments " : [ " < list of fulfillments > " ] ,
" conditions " : [ " < list of conditions > " ] ,
" operation " : " < string > " ,
" timestamp " : " < timestamp from client > " ,
" data " : {
" hash " : " < hash of payload > " ,
" payload " : " < any JSON document > "
}
}
}

fulfillments 是個 LIST 紀錄很多個 fulfillment,每個 fulfillment 包含尚未花費掉的資產訊息,如果要支出這個資產要滿足什麼條件。 fulfillment 是個簽章,可以用來證明資產擁有者身份

節錄 0.6.0 的 create transaction程式碼如下

一個 asset 一開始被 create transaction 建立出來的時候, owner_before, owner_after 都是執行 create transaction 的執行者

 def create(self, payload=None):
 """Issue a transaction to create an asset.

 Args:
 payload (dict): the payload for the transaction.

 Return:
 The transaction pushed to the Federation.
 """

 tx = self.consensus.create_transaction(
 owner_before=self.public_key,
 owner_after=self.public_key,
 tx_input=None,
 operation='CREATE',
 payload=payload)

 signed_tx = self.consensus.sign_transaction(
 tx, private_key=self.private_key)
 return self._push(signed_tx)

fulfillment 內容如下

{
 "owners_before": ["<public key of the owner before the transaction happened>"],
 "fid": 0,
 "fulfillment": "cf:4:RxFzIE679tFBk8zwEgizhmTuciAylvTUwy6EL6ehddHFJOhK5F4IjwQ1xLu2oQK9iyRCZJdfWAefZVjTt3DeG5j2exqxpGliOPYseNkRAWEakqJ_UrCwgnj92dnFRAEE",
 "input": {
 "cid": 0,
 "txid": "11b3e7d893cc5fdfcf1a1706809c7def290a3b10b0bef6525d10b024649c42d3"
 }
}

block資訊如下,注意這裡面並沒有 previous block 這種資訊,previous block 這個資訊其實是放在 voters 裡面,要投票檢查這個 block 是否合法的時候會填入 previous block

{
" id " : " < hash of block > " ,
" block " : {
" timestamp " : " < block - creation timestamp > " ,
" transactions " : [ " < list of transactions > " ] ,
" node_pubkey " : " < public key of the node creating the block > " ,
" voters " : [ " < list of federation nodes public keys > " ]
},
" signature " : " < signature of block > " ,
" votes " : [ " < list of votes > " ]
}

VOTE 資訊如下,其實這個投票是檢查這個 block 裡面有沒有不合法的交易,例如說出現 double spend,只是用 VOTE 這個字比較無法看出檢查的意味

注意下面兩點

  1. VOTE 結構裡面的 invalid_reason ,可能為 double_spend, transactions_hash_mismatch。看到這些字眼就比較容易理解所謂的 valid, invalid 大概是指哪些事情了
  2. VOTE 裡面有 previous block, chaining 是在 vote 的時候發生的
{
" node_pubkey " : " < the public key of the voting node > " ,
" vote " : {
" voting_for_block " : " < id of the block the node is voting for > " ,
" previous_block " : " < id of the block previous to this one > " ,
" is_block_valid " : " < true | false > " ,
" invalid_reason " : " < None | DOUBLE_SPEND | T R A N S A C T I O N S _ H A S H _ M I S M A T C H |
N O D E S_ PUB KE YS _MI SM AT CH " ,
" timestamp " : " < timestamp of the voting action > "
},
" signature " : " < signature of vote > "
}

 

修改原始碼之後用下面指令進行編譯、安裝與測試

$ python3.5 setup.py build
$ sudo python3.5 setup.py install
$ py.test-3.5 -v

 

下面是白皮書定義連結

https://www.bigchaindb.com/whitepaper/

  1. 百萬次/秒的寫入速度
  2. PB等級容量
  3. 一秒以內的延遲時間
  4. 從一個分散式資料庫開始,看了更多文件之後得知是 RethinkDB
  5. 再加上 blockchain 的特性,去中心化、不可竄改、創造並交易數位資產
  6. 自創 blockchain pipelining,這個是把 blockchain 特性加入 bigchainDB 的關鍵功能

 

Doc 連結如下,這個 Doc 連結是從這邊挖出來的https://github.com/bigchaindb/bigchaindb/blob/master/setup.py

https://bigchaindb.readthedocs.io/en/latest/

 

https://bigchaindb.readthedocs.io/en/latest/introduction.html#some-basic-vocabulary

  1. BigchainDB node:運行 RethinkDB, bigchainDB 的機器
  2. cluster:一群連線的機器,運行一個 RethinkDB, cluster 中可能會有作為監控的機器
  3. federation:一群 cluster 用一樣的政策管理稱之

 

quick start as below

https://bigchaindb.readthedocs.io/en/latest/quickstart.html

要先安裝RethinkDB, 可以知道這個 bigchainDB 是基於 RethinkDB 擴充出來的

但這個 quick start 就止於安裝而已了

要如何修改、開發是沒有提到的

 

最終找到這個頁面 https://github.com/bigchaindb/bigchaindb/blob/master/CONTRIBUTING.md

Step2 裡面的 Install BigchaindB Server’s OS-level dependencies 看起來就是編譯才需要的操作

在 python style guide 裡面有寫到測試的方法 https://github.com/bigchaindb/bigchaindb/blob/master/PYTHON_STYLE_GUIDE.md

當開發完成發生 pull request 的時候,會自動進行這個測試