首先我們來回顧一下區塊鏈中的一些概念
區塊**
區塊鏈**
交易**
1.如何儲存區塊鏈資料?
眾所周知,區塊鏈主要的特點就是去中心化,也就是採用分布式儲存。那麼我們如何將資料儲存在使用者本地呢?這裡採用bolt資料庫。bolt是乙個純go語言實現的鍵值資料,支援事務,介面簡單易用。
2.資料如何進行編碼?
當我們選擇好資料庫之後,接下來就要考慮如何把資料放入資料庫了。首先我們正常的區塊資料是乙個結構體,不能直接儲存在資料庫中。需要對其進行編碼,將其編碼成位元組流。那麼,我們應該選擇哪一種方式呢?go語言為我們提供了乙個gob包,使用gob就可以將結構體編碼成位元組流。然後再將位元組流儲存在資料庫中。
1.位元幣的交易流程
通過這張圖我們可以得知位元幣的交易流程為:2.什麼是區塊高度?建立交易——>廣播交易——>挖礦競爭——>廣播競爭結果——>由競爭勝出的礦工記賬——>同步賬本
所謂的區塊高度,其實就是當前區塊距離區塊鏈第1個區塊的高度。 第乙個區塊也成為創世塊,創世塊的區塊高度為0,第二個區塊的高度為1,第三個區塊的高度為2,以此類推。區塊高度是區塊的標示符,區塊有兩個標示符,一是區塊頭的雜湊值,二是區塊高度。
3.區塊結構是怎樣的?
1.建立區塊
func
newblock
(txs [
]*transaction, prevblockhash [
]byte
)*block
, timestamp:
uint64
(time.
now().
unix()
),difficulty:0,
nonce:0,
hash:
byte
, transactions: txs,
}//梅克爾根,根據當前區塊的交易而生成的hash值
block.merkelroot = block.
makemerkelroot()
//建立乙個工作量證明的結構體
pow :=
newproofofwork
(&block)
//呼叫工作量證明的run方法,不斷的計算,直到算出的區塊頭hash小於工作量證明結構中的目標值,然後返回區塊頭hash與nonce(隨機數,也就是挖礦要找的資料)
hash, nonce := pow.
run(
) block.hash = hash
block.nonce = nonce
return
&block
}
2.建立創世塊創世塊是區塊鏈裡的第乙個區塊
func
genesisblock
(address string
)*block ,[
]byte
)}
1.建立區塊鏈func
newblockchain
(address string
)*blockchain
else
return
nil}
)return
&blockchain
}
2.新增區塊func
(bc *blockchain)
addblock
(txs [
]*transaction)
//建立乙個區塊
block :=
newblock
(txs, lasthash)
bucket.
put(block.hash, block.
serialize()
) bucket.
put(
byte
("lasthashkey"
), block.hash)
bc.tail = block.hash
return
nil}
)}
在位元幣中,每個交易要以以前的交易為基礎,而不是以以特定字段記錄的餘額為基礎,而是一切都在交易記錄中。我們的錢零散的分布在不同的交易中。如果想要知道某個位址的餘額,那就需要遍歷整個賬本,把所有屬於整個位址的錢統計累加。1.挖礦交易
挖礦交易是特殊的交易,挖礦交易的input由系統生成,不引用utxo。
中本聰在創世塊的挖礦交易儲存的資訊:「the times 03/jan/2009 chancellor on brink of second bailout for banks」2.定義交易輸入結構體
說明錢的**
type txinput struct
3.定義交易輸出結構體說明錢的去處
type txoutput struct
4.定義交易結構體type transaction struct
5.獲取指定位址的utxo的交易集合//返回指定位址能夠支配的utxo所在交易的集合
func
(bc *blockchain)
findutxotransactions
(address string)[
]transaction}}
//如果這個output和我們目標的位址相同,滿足條件,加到返回utxo陣列中
if output.pubkeyhash == address }}
}}
利用go語言獲取位元幣餘額
我們輸入乙個位元幣位址,然後獲取對應位元幣位址擁有者對應的pubkey,由該公鑰檢測utxo集,獲取未花費交易,累加value,從而獲取位址對應的餘額 func cli cli getbalance address,nodeid string bc newblockchain nodeid utxo...
用go語言實現位元幣位址校驗
隨機取乙個32位隨機數作為私鑰 利用生產的隨機數採用橢圓加密演算法生成公鑰 計算公鑰的sha256雜湊值 計算ripemd 160雜湊值 第4步結果加上版本號 位元幣為0x00 對第5步結果取兩次sha256雜湊值 取上一步結果的前四個位元組 將第7步結果加到第步的結果後面作為校驗 利用base58...
區塊鏈101 位元幣挖礦是如何工作的
當你聽說位元幣 採礦 的時候,你會設想硬幣被從地下挖出來。但是位元幣不是物理的,那麼我們為什麼稱它為採礦呢?因為它類似於 開採,因為位元幣存在於協議的設計中 就像 存在於地下一樣 但它們還沒有被引入到光中 就像金子還沒有被挖掘出來一樣 位元幣協議規定,在某一時刻將存在2100萬位元幣。礦工 所做的就...