最近一直在學(xué)習(xí)區(qū)塊鏈的基礎(chǔ)知識,想了想決定將2個任務(wù)(學(xué)區(qū)塊鏈和寫作)相融合。寫區(qū)塊鏈相關(guān)的文字榕茧,既可以讓自己梳理出思路不清的地方,可以讓戰(zhàn)友們幫忙檢驗自己沒說明白的地方客给。(爭取之后在幣乎里面發(fā)表)
最近的感悟
先談?wù)勛罱母形蛴醚海瑤准∈虑椋?/p>
最近和室友住在一起,為了健身(減肥)起愈,每天一起做俯臥兩頭起只恨。第一天的時候,我只做了30個(1組)抬虽。由于身體的酸痛時間是從運動后48-72小時的時間段官觅,所以第二天我又做了60個兩頭起(2組)。第三天阐污,明顯感到肋骨前肌肉的疼痛感休涤,但也堅持做90個,雖然是上午2組,下午1組功氨,但由于使用同一位置的肌肉序苏,所以反而覺得酸痛被緩解了。目前已經(jīng)堅持到8天了捷凄,每天90個兩頭起(3組)和10個俯臥撐(因為自己手臂無力忱详,所以下沉的深度不夠,不過慢慢有好轉(zhuǎn))跺涤。
感受最深的是堅持健身和健康的飲食搭配匈睁,真的會讓人(主要是腸胃)感覺到舒服。同時桶错,也會讓自己變瘦變健康航唆。最大的動力來自于室友的鼓勵,每次做完一組院刁,她都會在旁邊說糯钙,“你好棒呀!” 這種真心實意的贊美讓人如沐春風(fēng)退腥,也會覺得自己特別棒任岸!跟007er宣揚評價機(jī)制的在本質(zhì)上是一致的。當(dāng)然啦阅虫,室友也是一名007er演闭,世界總是那么小,目前學(xué)習(xí)區(qū)塊鏈的同學(xué)里面也很多007er颓帝。鼓勵機(jī)制真的會有一種魔力米碰,有種讓人想變得越來越好的沖動,同時也覺得自己能做的事情有很多呀购城,比如每次做完飯的時候吕座,留下食物的照片或者視頻,等到課程結(jié)束時瘪板,我們就可以剪輯出小視頻吴趴,留下自己的處女電影作品或者寫成小小說,紀(jì)念我們的小日子侮攀。將日子過的越來越有儀式感锣枝。
還一件007內(nèi)的事情,昨天總結(jié)上期的優(yōu)秀作品兰英,我的點評竟然被選做最佳的點評撇叁。這是我從來不敢妄想的∑杳常總覺得自己做的很一般陨闹,并不會覺得做的很好楞捂。所以,驚喜之外趋厉,聯(lián)系了巫同學(xué)寨闹,他說感覺到我的進(jìn)步。點評的那天君账,我有回顧笑來老師的《通往財富自由之路》的一篇文章繁堡,所以點評才會言之有物,聯(lián)想到的東西就會更多杈绸。
以前總覺得自己什么也做不好帖蔓,跟身邊的人比起來,總覺得自己的學(xué)歷不夠瞳脓,所以覺得自己的腦子運轉(zhuǎn)起來也不如他們的感覺。但是當(dāng)我自己從這種想法中解救出來之后 澈侠,我發(fā)現(xiàn)自己并不比別人差劫侧,甚至有些事情上,還會超越他們哨啃。這樣的轉(zhuǎn)變烧栋,在上次的家庭聚餐上,也體現(xiàn)了出來拳球,當(dāng)我表達(dá)關(guān)于投資的概念就應(yīng)該是把自己的多余錢拿去投資审姓,并在心里將這部分錢認(rèn)為是丟了的狀態(tài)時,家里人對我的評價在那一瞬間就改變了祝峻。(當(dāng)然是笑來老師的概念啦魔吐,我覺得是正確的,所以使用起來了)我從沒有想過莱找,自己的想法能夠震撼到他們酬姆。而且之后家里人對我學(xué)習(xí)的事情,品頭論足了一番(我沒在家的情況下)奥溺。我本以為他們會很難理解辞色,并會使用批評的語氣來評價此事的。結(jié)果卻出乎了我的想象浮定。
好像最近很多的事情都超出了我的想象呢相满?
最近學(xué)習(xí)的東西
雙拼輸入法 (手指還不是很熟悉這種輸入法,每天練習(xí)30分鐘)
使用在行 約見老師
學(xué)習(xí)使用Markdown 好更加快速的記筆記及敲入代碼
學(xué)習(xí)區(qū)塊鏈的代碼
聯(lián)系英語口語(應(yīng)該更專注)
練習(xí)自己的專注力(剛剛開始了2次)
區(qū)塊鏈的內(nèi)容
如何創(chuàng)建文件/保存數(shù)據(jù)
計算機(jī)保存所有數(shù)據(jù)都是以數(shù)字的形式桦卒,然后再用不同的協(xié)議來使用數(shù)字代表文字立美、圖片等。
byte(字節(jié))
byte 是最小的有明確地址的儲存單位( bit 就沒有明確地址)
1 byte = 8 bits
bit: 1 or 0
是指針的大小闸盔。在32位系統(tǒng)里悯辙,為4個字節(jié);在64位系統(tǒng)中,為8個字節(jié)躲撰。
是最大的加減乘除的單操作單位针贬。
在 Intel 的文檔里,word 指 2 個 byte拢蛋。
本課程中桦他,指 4 個 byte。
4 個 byte谆棱,范圍為 -21億 ~ 21億快压,或 0 ~ 42 億。(注釋:4 個 byte 是4 * 8 = 32位垃瞧,即2^32 = 4294967296蔫劣,約 4.29 Billion)
8 個 byte 可保存的數(shù)字范圍為 0 ~ 1019
比特幣的最小單位是 10-8,你如果要發(fā)送 1個 BTC 給別人个从,在內(nèi)存中要保存的數(shù)字為 108脉幢,4個 byte 對比特幣系統(tǒng)來說太小,最大只能存 42個BTC嗦锐。所以BTC系統(tǒng)中是使用 8 個 byte嫌松。比特幣總量為 2100萬個,21 x 106?x 108?= 21 x 1014奕污,還是小于 1019?萎羔。
程序語言如何保存數(shù)據(jù)
計算機(jī)只有兩種保存數(shù)據(jù)的方式:
轉(zhuǎn)換成數(shù)字
轉(zhuǎn)換成數(shù)字的排列(Vector of numbers)
100 | 140 | 200 | 300
我們從操作系統(tǒng)得到的是一整塊內(nèi)存,程序語言需要把內(nèi)存進(jìn)行分配碳默,分成不同的部分來使用贾陷。程序語言有兩種方式使用內(nèi)存保存數(shù)據(jù):
將數(shù)據(jù)保存在一塊連續(xù)的內(nèi)存部分(vector), 更常用在硬盤(深儲存,計算機(jī)重啟后不會被刪除)中使用這種方式腻窒。
使用指針,數(shù)據(jù)是樹狀的昵宇。更常用在內(nèi)存(淺儲存,重啟計算機(jī)后會被刪除)中使用這種方式儿子。
例子:保存一套關(guān)于人的信息
屬性? ? ?身份號碼? ? ? 電話號碼? ? ? 名字地址
類型? ? ? 4 byte? ? ? ? 11位的string? ? string string
存儲方式數(shù)據(jù)結(jié)構(gòu)分配方式
vector? ? 連續(xù)靜態(tài)&動態(tài)
指針? ? ? 樹狀動態(tài)
使用指針的好處是:每個指針的大小是固定的瓦哎,比如本例中我要查找地址,只需要找到身份號碼的指針后柔逼,跳4格蒋譬,即可找到地址的指針。
但如果不用指針愉适,你就要先順序跳到名字犯助,然后確定名字占幾個字節(jié),然后才知道要再跳過幾個字節(jié)维咸,才能找到地址剂买。
Ruby惠爽、Python等高級語言會默認(rèn)用指針的方式,不會給你選擇瞬哼。由于高級語言都是用指針的方式婚肆,而文件格式的內(nèi)部用的都是 vector 方式,所以用高級語言操作文件不太適合坐慰。
C語言分配內(nèi)存的主要是用 malloc 函數(shù)较性,C語言對內(nèi)存比較節(jié)省,盡量用靜態(tài)分配结胀,因為對內(nèi)存的管理是手動的赞咙。
在Ruby、Python 這樣的動態(tài)語言中糟港,會頻繁呼叫 malloc 函數(shù)攀操,比如新建一個字符串、數(shù)組秸抚、從數(shù)組中取出一個元素等崔赌。
任何數(shù)據(jù)都可以通過數(shù)字和指針來表示,什么樣的關(guān)系都可以耸别。
但現(xiàn)實中的實際問題,要用數(shù)據(jù)結(jié)構(gòu)來表示县钥,需要程序員一定的思考和設(shè)計秀姐,才能找到最合適的數(shù)據(jù)結(jié)構(gòu)。因為數(shù)據(jù)結(jié)構(gòu)指序列若贮,樹省有,圖這些基本機(jī)構(gòu)以及它們的組合,在描述實際問題時谴麦,必然會用到蠢沿,比如區(qū)塊鏈對應(yīng)的大的數(shù)據(jù)結(jié)構(gòu)是鏈表,而分叉對應(yīng)的數(shù)據(jù)結(jié)構(gòu)是樹匾效。)
游戲開發(fā)者們需要經(jīng)常設(shè)計內(nèi)存數(shù)據(jù)結(jié)構(gòu)舷蟀,因為他們總在創(chuàng)造新的概念,新的概念需要新的對象來代表面哼。
SQL 通過數(shù)據(jù)表(Table)野宜,你給它一個抽象的數(shù)據(jù)結(jié)構(gòu)的描述,它能自動做內(nèi)存管理魔策,你就不需要去手動管理了匈子。 區(qū)塊鏈的儲存與 SQL 的對接,還有待研究闯袒。
區(qū)塊的結(jié)構(gòu)
區(qū)塊(在BTC中 < 1MB) = 區(qū)塊頭(大小固定虎敦,BTC中為80字節(jié)) | 區(qū)塊body(大小有變化)
body里含有多個 transaction(one to many)游岳,
Transaction -> 多個input —— 參數(shù)
? ? ? ? ? ? ? ? ? ? -> 多個output—— 參數(shù)
BTC 中每個交易下也要參數(shù),而XCY 中交易層面是沒有參數(shù)的其徙,做了簡化胚迫。
一個 block 里面至少有一個交易——generational transaction 或 coinbase,用于獎勵礦工擂橘。其他交易可能為 0 個晌区。
解析區(qū)塊(parsing/analysis):得到一個區(qū)塊后,如何寫函數(shù)來把頭切出來通贞,把 coinbase 切出來朗若,然后寫函數(shù)進(jìn)一步切開各個部分。
創(chuàng)建區(qū)塊(create)
區(qū)塊鏈系統(tǒng)的格式
每一個區(qū)塊鏈系統(tǒng)有三套格式:
A. 區(qū)塊鏈的儲存格式
B. 節(jié)點和應(yīng)用之間的通訊格式——創(chuàng)造自己的交易所昌罩、錢包要用到
C. 節(jié)點和節(jié)點之間的通訊格式——主要是P2P網(wǎng)絡(luò)的知識哭懈,引入少部分區(qū)塊鏈部分
A和C最重要掏熬。今天我們的學(xué)習(xí)內(nèi)容是 A带到。
BTC 格式的非官方說明文檔
A:?https://en.bitcoin.it/wiki/Block
B:?https://en.bitcoin.it/wiki/API_reference_(JSON-RPC)
C:?https://en.bitcoin.it/wiki/Protocol_documentation
ETH 格式的官方說明文檔
C:?https://github.com/ethereum/wiki/wiki/Ethereum-Wire-Protocol
XCY(Concise Yuan)
A: protocol-for-data-representation
B: protocol-for-applications
C: protocol-for-relays
protocol.txt
BTC相關(guān)網(wǎng)站:
查看開放節(jié)點:https://bitnotes.earn.com
查看虛擬貨幣市值:https://coinmarketcap.com
查看區(qū)塊信息:https://blockchain.info/
*表示0個以上,+表示1個以上
concise Yuan (XCY)
BLOCK := HEAD, BODY
HEAD :=
BODY := TRANSACTION+
TRANSACTION := INPUT+, OUTPUT+? //一個交易,有一個以上輸入患朱、有一個以上輸出
INPUT := A(4), index(4), B(4), public(B), C(4), signature(C)轨功, transaction(32)
OUTPUT := A(4), B(4), address(B), amount(8)
public(B),數(shù)據(jù)的長度是靈活的旭斥,需要的是公鑰,長度不固定古涧。
signature?垂券,簽名的長度不固定。72-68羡滑,更小的簽名也存在菇爪。
一個input的總大小:4 + 4 + 4 + B +4 + C + 32 = 48 + B + C
一個output的總大衅饣琛:4 + 4 + B + 8 = 16 + B
你要想發(fā)送錢凳宙,就必須在 INPUT 中說明你的錢來自哪筆交易,才能證明你真的擁有這筆錢职祷。
input的目的:
1)指定錢的來源:index 和transaction 是來指明你的錢來自哪筆交易氏涩;
2)證明錢是你的:public(公鑰的長度可能會不同) 和 signature(簽名的長度也不固定) 是來證明這筆錢是屬于你的,與加密驗證相關(guān)堪旧。
output 的目的是來指定:
1)發(fā)送多少錢
2)向哪一個賬號發(fā)送
OUTPUT:
A: 50 = OUTPUT 的總長度削葱,4+4+34+8=50
B: 34 = address 的長度,當(dāng)前使用地址的長度
address: 1NrrHYZMum2JaHJeSZufFitqg9W8uNdfzM
amount: 200,000,000 //額度是2個XCY
在內(nèi)存中是這樣:
0 4 8 42 50
[50, 34, 1NrrHYZMum2JaHJeSZufFitqg9W8uNdfzM, 200000000]
INPUT:
A: 總共的大小
index: 一筆交易可以有多個收款人,所以要把transaction內(nèi)的輸出號(你是第幾個收款人)寫在這里淳梦。
B: public 的大小
public: 我的公鑰
C: signature 的大小
signature: 自己的私鑰的簽名(簽名能證明這個私鑰是你的析砸,但不會暴露你的私鑰)
transaction:之前接受錢是在哪個交易?把交易的身份號寫這里 (交易身份號TxID 32 個字節(jié))
區(qū)塊 = 頭部(總是存在的)+ coinbase(總是存在的)+ 其他交易(可能有0 個或者以上)
HEAD 包含如下內(nèi)容:
current(32) 當(dāng)前區(qū)塊的身部的身份號 Merkle Tree
nonce (4) 挖礦中被設(shè)定的數(shù)值爆袍,在 0-42 億間猜數(shù)字首繁。目前改成了 12 個字節(jié)(BTC 在 body 又中加了 8 個字節(jié))
previous: 前一個區(qū)塊的身份號
target(32) 挖礦的難度作郭。target越大,挖礦難道越小弦疮。target 的難度會根據(jù)時間調(diào)整夹攒。
time(4) 時間
valence(4) 包含多少個交易
XCY的頭部有 108 個字節(jié),BTC的頭部是 80 個字節(jié)(經(jīng)過了壓縮)
挖礦的過程是
猜測 nonce胁塞,nonce就是那個隨機(jī)數(shù)啦
計算 SHA256(current + nonce)
查看小不小于target
要是不小于咏尝,重復(fù) #1
1/65536
分叉
自然分叉:如果同一時刻有不只一個區(qū)塊被挖出來,就會暫時將這幾個區(qū)塊都上鏈啸罢,然后再繼續(xù)看后面新產(chǎn)生的區(qū)塊連接到哪個分支上编检,最終會只保留最長的分支,其余分支會被廢棄扰才。