簡述區塊鏈(1)- 也許只有這一篇

一、嘮叨兩句

最近一直在考慮一個事情,就是怎么給不太了解技術的人講清楚區塊鏈。我先試著寫下來,然后在逐步打磨吧,目標就是讓哪些說看區塊鏈看的云里霧里的同學能對區塊鏈有一些認知。

?

二、定義

簡單的給區塊鏈下個定義:基于加密算法的,去中心化的分布式賬本技術。這里有三個關鍵詞:加密算法、去中心化、分布式賬本,下面我就嘗試從三個關鍵詞為線索,介紹一下區塊鏈的概念。

?

三、分布式賬本

比特幣是一個點對點的電子現金系統,既然是現金系統,那么就得記賬唄,這大概就是這個賬本的由來,就是流水賬嘛,張三給了李四一百塊錢,王五給了張三五十塊錢,blabla。這種東西,就是一條一條的數據,記錄在文件里,數據庫里等等。區塊鏈的賬本存儲,當然就是區塊和鏈了。分布式賬本,就是在說不僅存一份數據,每個全節點都存一份數據,只要不是全部節點掛掉,總有節點可提供數據的。

1. 區塊:塊由區塊頭和區塊體組成,區塊頭包含一些前一個區塊的Hash啊,當前區塊中所有交易的默克爾樹根啊,時間戳啊,隨機數啊,等等。區塊體里就是一筆筆的交易。

簡單說下默克爾樹,比如當前區塊有4比交易A,B,C,D,AB取hash,CD取hash,兩個Hash結果再取hash,就形成了默克爾樹,樹根可以理解為一個checksum,任何一個交易改一點,整棵默克爾樹就都變化了,可以保證沒有篡改,這個樹還可以支持輕錢包SPV驗證。

2. 交易:每一筆交易主要包含了一個或多個Input和Output,Input記錄的是引用到的前一筆未花費交易的索引,Output記錄的是將資產轉移到那個地址。這里講腳本的時候,還要講。

3. 鏈:剛才講了區塊頭包含了前一個區塊的Hash,這東西就是為了把區塊連接起來,成為一個鏈,鏈上的交易順序不能認為嚴格的前后關系,但是基本可以認為是有一個追溯的結構。作為程序猿,你會想需要遍歷鏈,怎么整,拿到創世塊,它沒有前一個區塊Hash,取到它的默克爾樹根作為key去存儲里面找下一個區塊,如此往復。

?

四、去中心化

我想把這部分通過和一般NoSql數據庫的一些方式做對比,NoSql數據庫為了達到讀的并發性能和數據的安全,通常都會保存多個副本,ReplicaSet的概念。同時對于寫的數據,總要先找個主節點寫,寫完了再同步給副本集,選主的時候,數據一致的時候,都需要幾個節點達成共識,通常會有Paxos,Raft這樣的算法來保證。把這部分放大到公網上,就基本可以映射到區塊鏈上了,區塊鏈的各個全節點都保持一個完整賬本,全網的ReplicaSet;獲得記賬權要記賬寫塊了,誰來寫,區塊鏈上通過PoW,PoS,DPos等等共識算法來達成共識,又和Paxos,Raft對應上了。

說到共識了,我們想一下記賬權這個事,就是挖礦,首先是個經濟問題,我干嘛要挖啊,你得給我獎勵,比特幣系統中獲得了記賬權生成了區塊,就能獲得比特幣的獎勵,比特幣價格高,當然可以激勵記賬這個事了,那么問題來了,這個經濟問題變成了一個博弈問題了,這么賺錢,憑啥你挖啊。這時候就得有個算法來規定好游戲玩法,比特幣怎么個玩法PoW,就是來個數學謎題,誰算出來誰記賬。這個數學謎題可以簡單這么理解,就是你生成的塊,加上一個隨機數位可以調節,然后基于一種Hash算法,你生成出來的結果必須小于某某數,這個某某數就是難度,可以動態調節的,現在比特幣的這個難度很高,所以你也就別跟礦主彪啦。那為什么叫PoW了,就是工作量證明,因為這個Hash之間沒有關聯型,我上次隨機數計算的結果和我這次隨機數計算的結果之間沒有半分錢關聯,這也就是為啥算力規模越來越大了,可以并行計算,算力越大,概率越大。你要非較真說,其實理論上,你可能很少計算就剛好碰到了正確結果,沒錯,這事就可以類比高考了,你說有沒有神蒙,蒙得高分,有,但是大體上這個考分大概其能證明你努力過吧。

?

五、加密算法

非對稱加密大伙都明白,不多講了,利用非對稱加密的簽名驗簽可以實現區塊鏈最關鍵的特點,確權。只有我用我的私鑰簽名過的數據,你用我的公鑰才能驗證通過,其他誰想仿造都不行,所以這錢就只能是我來花了。說到確權,這事可大了,區塊鏈為啥火,就是因為確權,數字資產能確權了,這意味著什么?意味著互聯網變成了價值互聯網了,價值可以傳遞了。

那這簽名驗簽的用哪兒了,也沒見哪兒使啊,別急,剛才咱介紹交易的時候不是留了一個箭頭么,這交易上記的不僅僅是轉移到對方的地址,而是一個腳本。如果就一地址擱那,都說是自己的,那不亂套了,這錢誰能用,得確權,這就需要腳本系統了。

首先說說比特幣的地址啊,地址咋生成,下圖講的特清楚,我從網上拷的。你說好好一圖,我隨便用,不能賣錢,為啥,不就是因為沒法確權嘛。

然后我們簡單說說這個比特幣的腳本系統,它是基于棧的腳本系統。這里我暫時不展開,僅已最常用的比特幣鎖定腳本P2PKH腳本作為例子講講。

鎖定腳本

DUP HASH160 [Public Key Hash] EqualVerify CheckSig

花錢的時候你得通過鎖定腳本的驗證,這個就是一個確權的過程,你要想驗證通過你得提供解鎖腳本

[Sig] [Public Key]

簡單說下驗證過程吧,下面這堆腳本基于棧執行

[Sig] [Public Key] DUP HASH160 [Public Key Hash] EqualVerify CheckSig

1. [Sig]入棧

2. [Public Key]入棧

3. DUP復制棧頂[Public Key]再入棧

4. 拿出棧頂[Public Key]執行HASH160(這個正是Public Key Hash的算法),入棧

5. 鎖定腳本里的常量[Public Key Hash]入棧

6. 取出棧頂里腳本里的[Public Key Hash]和計算出來的比較,相等就繼續

7. 這下棧里從底到頂分別是[Sig][Public Key],CheckSig拿出棧里這倆驗簽,通過錢就是你的,請用。

?

比特幣的腳本指令很多,你可以自己寫腳本出來,就是有點麻煩,寫匯編似的,但是這東西也是個好東西,直接就引出了后面的智能合約來了,

?

六、小結

今天主要從加密算法,去中心化和分布式賬本三個方面簡單介紹了一下區塊鏈,感覺沒達到我的預期讓沒接觸過的突然開竅的感覺,后面打磨打磨吧的再。本文里主要以比特幣作為實例進行介紹的,我覺得比特幣最牛逼的地方就是確權和智能合約,打開了無限遐想。公鏈上開發,很多選擇,我其實不太喜歡比特幣,開發起來太麻煩,而且就現在這個幣值,搞些大宗交易,跨境大額轉賬啥的還成,其他的,呵呵吧,但是幣王還是幣王,這里面的原理還是值得細細琢磨的。

?

轉載于:https://www.cnblogs.com/DexterDi/p/8689095.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247449.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247449.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue CLI 3.0腳手架如何在本地配置mock數據json

前后端分離的開發模式已經是目前前端的主流模式,至于為什么會前后端分離的開發我們就不做過多的闡述,既然是前后端分離的模式開發肯定是離不開前端的數據模擬階段。 我們在開發的過程中,由于后臺接口的沒有完成或者沒有穩定之前我們都是采用…

python 通過下載包setup.py安裝模塊

下載安裝包,并解壓到相應的位置 1、打開cmd 2、到達安裝目錄 3、python setup.py build 4、python setup.py install 轉載于:https://www.cnblogs.com/liuchunxiao83/p/11207340.html

webpack之externals操作三部曲--正確的姿勢

1.作用 首先webpack提供這個externals選項作用是從打包的bundle文件中排除依賴。換句話說就是讓在項目中通過import引入的依賴在打包的時候不會打包到bundle包中去,而是通過script的方式去訪問這些依賴。 2.怎么用? 以jquery為例子,目的是在…

Anaconda3自帶jupyter

1、cmd命令行中輸入 JupyterNotebook 2、系統自動調起下面頁面(注冊端口沖突是打不開的) 轉載于:https://www.cnblogs.com/liuchunxiao83/p/11207385.html

python 的按位與 或 異或 運算

符號 描述 運算規則 by MoreWindows & 與 兩個位都為1時,結果才為1 (統計奇數) | 或 兩個位都為0時,結果才為0 (統計偶數) ^ 異或 兩…

理解Shadow DOM

1. 什么是Shadow DOM? Shadow DOM 如果按照英文翻譯的話可以理解為 影子DOM, 何為影子DOM呢?可以理解為一般情況下使用肉眼看不到的DOM結構,那如果一般情況下看不到的話,那也就是說我們無法直接控制操縱的DOM結構。 Shadow DOM 它是HTML的一…

046 實例11-自動軌跡繪制

目錄 一、"自動軌跡繪制"問題分析1.1 問題分析1.2 自動軌跡繪制二、"自動軌跡繪制"實例講解2.1 自動軌跡繪制2.2 數據接口定義2.3 數據文件三、"自動軌跡繪制"舉一反三3.1 理解方法思維3.2 應用問題的擴展一、"自動軌跡繪制"問題分析 …

bootstrap-select采坑

bootstrap-select采坑 1.class"selectpicker" 普通的下拉框功能 2.title"請選擇城市名稱" title的作用與palcehoder一樣。 3.select class"selectpicker" multiple selectpicker和multiple屬性的搭配使用可實現多選 4.data-live-search"tru…

對vue虛擬dom的研究

Vue.js通過編譯將template 模板轉換成渲染函數(render ) ,執行渲染函數就可以得到一個虛擬節點樹在對 Model 進行操作的時候,會觸發對應 Dep 中的 Watcher 對象。Watcher 對象會調用對應的 update 來修改視圖。這個過程主要是將新舊虛擬節點進行差異對比…

element-ui之dialog組件title插槽的使用

dialog對話框組件title屬性的slot使用方法 使用背景 需要單獨控制title中某個數據顯示及樣式&#xff0c;footer也一樣 <el-dialog// 也可以這樣寫,但是沒有辦法單獨控制name age的顯示// title"name age"title"提示":visible.sync"dialogVisi…

css3自適應布局單位vw,vh

視口單位(Viewport units) 什么是視口&#xff1f; 在桌面端&#xff0c;視口指的是在桌面端&#xff0c;指的是瀏覽器的可視區域&#xff1b;而在移動端&#xff0c;它涉及3個視口&#xff1a;Layout Viewport&#xff08;布局視口&#xff09;&#xff0c;Visual Viewport…

python 操作 elasticsearch-7.0.2 遇到的問題

錯誤一&#xff1a;TypeError: search() got an unexpected keyword argument doc_type&#xff0c;得到不預期外的參數 解決方法&#xff1a;elasticsearch7里不用文檔類型&#xff0c;所以去掉 doc_typecredit_data 錯誤二&#xff1a;RequestError(400, illegal_argument_ex…

用到的Shell

sed 1i 添加的內容 file #這是在第一行前添加字符串 sed $i 添加的內容 file #這是在最后一行行前添加字符串 sed $a添加的內容 file #這是在最后一行行后添加字符串 sed -i s/.*/行首添加內容&行尾添加內容/ 文件名 //每一行 sed -i $a新增的一行 tars_build_tar.sh a…

如何解決瀏覽器縮小出現橫向滾動條時網頁背景圖出現空白的問題

原因&#xff1a; 當窗口縮小時&#xff0c;瀏覽器默認100%寬度為瀏覽器窗口的寬度。而忽略了下部內容層固定寬度(1024px)。從而出現了固定寬度大于100%寬度的現象。瀏覽以此理解來解析頁面&#xff0c;就出現了容器寬度理解上的差異&#xff0c;出現了一個非常奇特的BUG。 解…

前端設計模式

1. 單例模式 2.裝飾器模式 轉載于:https://www.cnblogs.com/lyraLee/p/11210985.html

區別 (function($){...})(jQuery)、$(function(){ })和$.fn

一、(function($){…})(jQuery) 首先function(arg){...}定義了一個匿名函數&#xff0c;參數為arg,而調用時需要在函數后面寫上括號和實參&#xff0c;由于操作符的優先級&#xff0c;函數本身也需要括號&#xff0c;也就成了&#xff1a; &#xff08;function(arg){...}&…

git 清除緩存

清除git緩存 git config --local --unset credential.helpergit config --global --unset credential.helpergit config --system --unset credential.helper保存git緩存 git config --global credential.helper store轉載于:https://www.cnblogs.com/zhouyideboke/p/11211650.…

網頁里如何使用js禁用控制臺

網頁里如何禁用右擊事件&#xff1f;使用jQuery&#xff0c;幾句代碼就可以搞定了 document.oncontextmenu function(){return false;} 簡單示例&#xff1a; js實現&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><…

Java生鮮電商平臺-訂單中心服務架構與異常訂單邏輯

Java生鮮電商平臺-訂單中心服務架構與異常訂單邏輯 訂單架構實戰中闡述了訂單系統的重要性&#xff0c;并從訂單系統的信息架構和流程上對訂單系統有了總體認知&#xff0c;同時還穿插著一些常見的訂單業務規則和邏輯。上文寫到訂單的拆單部分時擱置了&#xff0c;現在接上文繼…

Vuex的全面用法總結

1. vuex簡介 vuex是專門用來管理vue.js應用程序中狀態的一個插件。他的作用是將應用中的所有狀態都放在一起&#xff0c;集中式來管理。需要聲明的是&#xff0c;這里所說的狀態指的是vue組件中data里面的屬性。了解vue的同學應該是明白data是怎么回事的吧&#xff0c;如果不懂…