學習區(qū)塊鏈知識2

最近一直在學習區(qū)塊鏈的基礎(chǔ)知識,想了想決定將2個任務(wù)(學區(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))。

感受最深的是堅持健身和健康的飲食搭配,真的會讓人(主要是腸胃)感覺到舒服。同時,也會讓自己變瘦變健康。最大的動力來自于室友的鼓勵,每次做完一組,她都會在旁邊說,“你好棒呀!” 這種真心實意的贊美讓人如沐春風,也會覺得自己特別棒!跟007er宣揚評價機制的在本質(zhì)上是一致的。當然啦,室友也是一名007er,世界總是那么小,目前學習區(qū)塊鏈的同學里面也很多007er。鼓勵機制真的會有一種魔力,有種讓人想變得越來越好的沖動,同時也覺得自己能做的事情有很多呀,比如每次做完飯的時候,留下食物的照片或者視頻,等到課程結(jié)束時,我們就可以剪輯出小視頻,留下自己的處女電影作品或者寫成小小說,紀念我們的小日子。將日子過的越來越有儀式感。

還一件007內(nèi)的事情,昨天總結(jié)上期的優(yōu)秀作品,我的點評竟然被選做最佳的點評。這是我從來不敢妄想的。總覺得自己做的很一般,并不會覺得做的很好。所以,驚喜之外,聯(lián)系了巫同學,他說感覺到我的進步。點評的那天,我有回顧笑來老師的《通往財富自由之路》的一篇文章,所以點評才會言之有物,聯(lián)想到的東西就會更多。

以前總覺得自己什么也做不好,跟身邊的人比起來,總覺得自己的學歷不夠,所以覺得自己的腦子運轉(zhuǎn)起來也不如他們的感覺。但是當我自己從這種想法中解救出來之后 ,我發(fā)現(xiàn)自己并不比別人差,甚至有些事情上,還會超越他們。這樣的轉(zhuǎn)變,在上次的家庭聚餐上,也體現(xiàn)了出來,當我表達關(guān)于投資的概念就應(yīng)該是把自己的多余錢拿去投資,并在心里將這部分錢認為是丟了的狀態(tài)時,家里人對我的評價在那一瞬間就改變了。(當然是笑來老師的概念啦,我覺得是正確的,所以使用起來了)我從沒有想過,自己的想法能夠震撼到他們。而且之后家里人對我學習的事情,品頭論足了一番(我沒在家的情況下)。我本以為他們會很難理解,并會使用批評的語氣來評價此事的。結(jié)果卻出乎了我的想象。

好像最近很多的事情都超出了我的想象呢?

最近學習的東西


雙拼輸入法 (手指還不是很熟悉這種輸入法,每天練習30分鐘)

使用在行 約見老師

學習使用Markdown 好更加快速的記筆記及敲入代碼

學習區(qū)塊鏈的代碼

聯(lián)系英語口語(應(yīng)該更專注)

練習自己的專注力(剛剛開始了2次)

區(qū)塊鏈的內(nèi)容


如何創(chuàng)建文件/保存數(shù)據(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ù)

計算機只有兩種保存數(shù)據(jù)的方式:

轉(zhuǎn)換成數(shù)字

轉(zhuǎn)換成數(shù)字的排列(Vector of numbers)

100 | 140 | 200 | 300

我們從操作系統(tǒng)得到的是一整塊內(nèi)存,程序語言需要把內(nèi)存進行分配,分成不同的部分來使用。程序語言有兩種方式使用內(nèi)存保存數(shù)據(jù):

將數(shù)據(jù)保存在一塊連續(xù)的內(nèi)存部分(vector), 更常用在硬盤(深儲存,計算機重啟后不會被刪除)中使用這種方式。

使用指針,數(shù)據(jù)是樹狀的。更常用在內(nèi)存(淺儲存,重啟計算機后會被刪除)中使用這種方式。

例子:保存一套關(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等高級語言會默認用指針的方式,不會給你選擇。由于高級語言都是用指針的方式,而文件格式的內(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)指序列,樹,圖這些基本機構(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ù)進一步切開各個部分。

創(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最重要。今天我們的學習內(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ā)送

假設(shè)我想給一個人發(fā)送 2 XCY:

OUTPUT:

A: 50 = OUTPUT 的總長度,4+4+34+8=50

B: 34 = address 的長度,當前使用地址的長度

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é))

頭部結(jié)構(gòu)

區(qū)塊 = 頭部(總是存在的)+ coinbase(總是存在的)+ 其他交易(可能有0 個或者以上)

HEAD 包含如下內(nèi)容:

current(32) 當前區(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就是那個隨機數(shù)啦

計算 SHA256(current + nonce)

查看小不小于target

要是不小于,重復 #1

1/65536

分叉

自然分叉:如果同一時刻有不只一個區(qū)塊被挖出來,就會暫時將這幾個區(qū)塊都上鏈,然后再繼續(xù)看后面新產(chǎn)生的區(qū)塊連接到哪個分支上,最終會只保留最長的分支,其余分支會被廢棄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 以太坊(Ethereum ):下一代智能合約和去中心化應(yīng)用平臺 翻譯:巨蟹 、少平 譯者注:中文讀者可以到以太坊愛...
    車圣閱讀 3,808評論 1 7
  • 【中文版】以太坊白皮書 翻譯:少平、 Seven當中本聰在 2009 年 1 月啟動比特幣區(qū)塊鏈時,他同時向世界引...
    __Seven__閱讀 4,312評論 0 10
  • 我希望有個如你一般的人。如這山間清晨一般明亮清爽的人,如奔赴古城道路上陽光一般的人,溫暖而不炙熱,覆蓋我所有肌膚。...
    史密斯思密達閱讀 1,472評論 0 2
  • Ok. Today I will discuss another sad news. well, sad ever...
    北燕南洄閱讀 221評論 0 0