整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          區塊鏈其實很“弱智”,如何用JavaScript寫一個區塊鏈?

          去年開始,伴隨著比特幣的火爆,區塊鏈成為比“人工智能”、“共享”還要火的詞匯。各大企業,諸如阿里、京東、騰訊、百度等紛紛入局。

          關于區塊鏈技術的文章已經泛濫成災,但大多讀起來晦澀難懂。今天這篇文章,會迅速讓你感覺區塊鏈其實很“弱智”。

          晦澀難懂的區塊鏈到底是什么?

          什么是區塊鏈?我們首先用談戀愛舉個簡單的例子。

          未來所有適齡男女戀愛,結婚的承諾全過程都被其他所有適齡男女共識,兩個人在一起發生的所有故事就會形成區塊。

          其他所有男女就是鏈,如果有第三者來插足或自身違背另一半,其他人都能看到,以后就再也找不到對象了。

          區塊鏈準確的說就是“全中心”體系,就是鏈上的每個節點都是中心。不可刪除,不可更改,這就是區塊鏈技術的基本特征。

          3 分鐘小視頻:漫畫解讀什么是區塊鏈

          講比特幣的人很多,懂比特幣的人也很多,但是具體到區塊鏈,現在并沒有一個很清楚的定義說什么是區塊鏈,基本上所有的介紹里都是這樣的:

          比特幣→區塊鏈是比特幣的底層技術,或者比特幣→比特幣是一種區塊鏈。

          所以從純理論角度說對區塊鏈的定義:

          區塊鏈是一個放在非安全環境中的分布式數據庫(系統)。

          區塊鏈采用密碼學的方法來保證已有數據不可能被篡改。

          區塊鏈采用共識算法來對新增數據達成共識。

          具有以上三個性質的系統,就是區塊鏈。

          區塊鏈相關的概念

          在互聯網去中心化下有很多產物,下面是一些區塊鏈相關的概念。

          P2P 下載

          一種硬盤的共享,是把每個人電腦上的一部分硬盤,拿出來與其他人共享,對應的形態就是迅雷。

          P-CDN

          這是一種分布式的存儲,共享分布式的寬帶。

          分布式計算

          我們去破譯算法或者密碼時會用到超級計算機,它可以單獨用很快的速度破解密碼,這就是中心化的計算。

          而分布式計算的概念就是把大量的計算工作切分成無數的小塊計算,并且分配給世界上各個普通的計算機。

          當全世界幾千,幾萬甚至幾十萬臺個人電腦的 CPU,同時計算的時候,再怎么樣計算速度都會比一個超級計算機要快。

          ICO

          ICO(Initial Coin Offering),首次幣發行,源自股票市場的首次公開發行(IPO)概念,是區塊鏈項目首次發行代幣,募集比特幣、解決以太坊等通用數字貨幣的行為。

          也是一種為加密數字貨幣/區塊鏈項目籌措資金的常用方式。ICO 能夠在沒有任何的實際項目執行的情況下,很快就融到一大筆比特幣、以太幣,或者其他代幣。

          幾乎每個人都聽說過像比特幣和以太幣這樣的加密貨幣,但是只有極少數人懂得隱藏在它們背后的技術。

          下面我將會用 JavaScript 來創建一個簡單的區塊鏈來演示它們的內部究竟是如何工作的。

          用 JavaScript 寫一個區塊鏈

          具體分為以下三個部分:

          • 實現一個基本的區塊鏈

          • 實現 POW

          • 交易與挖礦獎勵

          實現一個基本的區塊鏈

          區塊鏈

          區塊鏈是由一個個任何人都可以訪問的區塊構成的公共數據庫。這好像沒什么特別的,不過它們有一個有趣的屬性:它們是不可變的。

          一旦一個區塊被添加到區塊鏈中,除非讓剩余的其余區塊失效,否則它是不會再被改變的。

          這就是為什么加密貨幣是基于區塊鏈的原因。你肯定不希望人們在交易完成后再變更交易!

          創造一個區塊

          區塊鏈是由許許多多的區塊鏈接在一起的(這聽上去好像沒毛病..)。鏈上的區塊通過某種方式允許我們檢測到是否有人操縱了之前的任何區塊。

          那么我們如何確保數據的完整性呢?每個區塊都包含一個基于其內容計算出來的 hash。同時也包含了前一個區塊的 hash。

          下面是一個區塊類用 JavaScript 寫出來大致的樣子:

          因為 JavaScript 中并不支持 sha256 所以我引入了 crypto-js 庫。然后我定義了一個構造函數來初始化區塊的屬性。

          每一個區塊上都被賦予了 index 屬性來告知我們這個區塊在整個鏈上的位置。我們同時也生成了一個時間戳,以及需要在區塊里存儲的一些數據。最后是前一個區塊的 hash。

          創造一個鏈

          現在我們可以在 Blockchain 類中將區塊鏈接起來了。下面是用 JavaScript 實現的代碼:

          在構造函數里,我通過創建一個包含創世塊的數組來初始化整個鏈。第一個區塊是特殊的,因為它不能指向前一個區塊。

          我還添加了下面兩個方法:

          • getLatestBlock() 返回我們區塊鏈上最新的區塊。

          • addBlock() 負責將新的區塊添加到我們的鏈上。

          為此,我們將前一個區塊的 hash 添加到我們新的區塊中。這樣,我們就可以保持整個鏈的完整性。

          因為只要我們變更了最新區塊的內容,我們就需要重新計算它的 hash。當計算完成后,我將把這個區塊推進鏈里(一個數組)。

          最后,我創建一個 isChainValid() 來確保沒有人篡改過區塊鏈。它會遍歷所有的區塊來檢查每個區塊的 hash 是否正確。

          它會通過比較 previousHash 來檢查每個區塊是否指向正確的上一個區塊。如果一切都沒有問題,它會返回 true 否則會返回 false。

          使用區塊鏈

          我們的區塊鏈類已經寫完啦,可以真正的開始使用它了。

          在這里我僅僅是創建了一個區塊鏈的實例,并且命名它為 SavjeeCoin。之后我在鏈上添加了一些區塊。

          區塊里可以包含任何你想要放的數據,不過在上面的代碼里,我選擇添加了一個帶有 amount 屬性的對象。

          試著操作吧!

          在介紹里我曾說過區塊鏈是不可變的。一旦添加,區塊就不可能再變更了。讓我們試一下。

          我會在一開始通過運行 isChainValid() 來驗證整個鏈的完整性。我們操作過任何區塊,所以它會返回 true。

          之后我將鏈上的第一個(索引為 1)區塊的數據進行了變更。之后我再次檢查整個鏈的完整性,發現它返回了 false。我們的整個鏈不再有效了。

          結論

          這個小栗子還遠未達到完成的程度。它還沒有實現 POW(工作量證明機制)或 P2P 網絡來與其他礦工來進行交流。

          但它確實證明了區塊鏈的工作原理。許多人認為原理會非常復雜,但這篇文章證明了區塊鏈的基本概念是非常容易理解和實現的。

          實現 POW

          在上文中我們用 JavaScript 創建了一個簡單的區塊鏈來演示區塊鏈的工作原理。

          不過這個實現并不完整,很多人發現依舊可以篡改該系統。沒錯!我們的區塊鏈需要另一種機制來抵御攻擊。讓我們來看看我們該如何做到這一點。

          問題

          現在我們可以很快的創造區塊,然后非常迅速的將它們添加進我們的區塊鏈中。

          不過這導致了三個問題:

          • 人們可以快速創建區塊,然后在我們的鏈里塞滿垃圾。大量的區塊會導致我們區塊鏈過載并讓它無法使用。

          • 因為創建一個有效的區塊太容易了,人們可以篡改鏈中的某一個區塊,然后重新計算所有區塊的 hash。即使它們已經篡改了區塊,他們仍然可以以有效的區塊來作為結束。

          • 你可以通過結合上述兩個破綻來有效控制區塊鏈。區塊鏈由 P2P 網絡驅動,其中節點會將區塊添加到可用的最長鏈中。

          所以你可以篡改區塊,然后計算所有其他的區塊,最后添加任意多你想要添加的區塊。你最后會得到一個最長的鏈,所有的其他節點都會接受它,然后往上添加自己的區塊。

          顯然我們需要一個方案來解決這些問題:POW(proof-of-work:工作量證明)。

          什么是 POW

          POW 是在第一個區塊鏈被創造之前就已經存在的一種機制。這是一項簡單的技術,通過一定數量的計算來防止濫用。

          工作量是防止垃圾填充和篡改的關鍵。如果它需要大量的算力,那么填充垃圾就不再值得。

          比特幣通過要求 hash 以特定 0 的數目來實現 POW。這也被稱之為難度,不過等一下!一個區塊的 hash 怎么可以改變呢?

          在比特幣的場景下,一個區塊包含有各種金融交易信息。我們肯定不希望為了獲取正確的 hash 而混淆了那些數據。

          為了解決這個問題,區塊鏈添加了一個 Nonce 值。Nonce 是用來查找一個有效 hash 的次數。

          而且,因為無法預測 hash 函數的輸出,因此在獲得滿足難度條件的 hash 之前,只能大量組合嘗試。尋找到一個有效的 hash(創建一個新的區塊)在圈內稱之為挖礦。

          在比特幣的場景下,POW 確保每 10 分鐘只能添加一個區塊。你可以想象垃圾填充者需要多大的算力來創造一個新區塊,他們很難欺騙網絡,更不要說篡改整個鏈。

          實現 POW

          我們該如何實現呢?我們先來修改我們區塊類并在其構造函數中添加 Nonce 變量。我會初始化它并將其值設置為 0。

          我們還需要一個新的方法來增加 Nonce,直到我們獲得一個有效 hash。強調一下,這是由難度決定的。所以我們會收到作為參數的難度。

          最后,我們還需要更改一下 calculateHash() 函數。因為目前它還沒有使用 Nonce 來計算 hash。

          將它們結合在一起,你會得到如下所示的區塊類:

          修改區塊鏈

          現在,我們的區塊已經擁有 Nonce 并且可以被開采了,我們還需要確保我們的區塊鏈支持這種新的行為。

          讓我們先在區塊鏈中添加一個新的屬性來跟蹤整條鏈的難度。我會將它設置為 2(這意味著區塊的 hash 必須以 2 個 0 開頭)。

          現在剩下要做的就是改變 addBlock() 方法,以便在將其添加到鏈中之前確保實際挖到該區塊。下面我們將難度傳給區塊。

          大功告成!我們的區塊鏈現在擁有了 POW 來抵御攻擊了。

          測試

          現在讓我們來測試一下我們的區塊鏈,看看在 POW 下添加一個新區塊會有什么效果。

          我將會使用之前的代碼,我們將創建一個新的區塊鏈實例,然后往里添加 2 個區塊。

          如果你運行了上面的代碼,你會發現添加新區塊依舊非常快。這是因為目前的難度只有 2(或者你的電腦性能非常好)。

          如果你創建了一個難度為 5 的區塊鏈實例,你會發現你的電腦會花費大概 10 秒鐘來挖礦。隨著難度的提升,你的防御攻擊的保護程度越高。

          免責聲明

          就像之前說的:這絕不是一個完整的區塊鏈。它仍然缺少很多功能(像 P2P 網路)。這只是為了說明區塊鏈的工作原理。

          并且:由于單線程的原因,用 JavaScript 來挖礦并不快。

          交易與挖礦獎勵

          在前面兩部分我們創建了一個簡單的區塊鏈,并且加入了 POW 來抵御攻擊。

          然而我們在途中也偷了懶:我們的區塊鏈只能在一個區塊中存儲一筆交易,而且礦工沒有獎勵。現在,讓我們解決這個問題!

          重構區塊類

          現在一個區塊擁有 index,previousHash,timestamp,data,hash 和 nonce 屬性。

          這個 index 屬性并不是很有用,事實上我甚至不知道為什么開始我要將它添加進去。

          所以我把它移除了,同時將 data 改名為 transactions 來更語義化。

          當我們改變區塊類時,我們也必須更改 calculateHash()函數。現在它還在使用老舊的 index 和 data 屬性。

          交易類

          在區塊內,我們將可以存儲多筆交易。因此我們還需要定義一個交易類,這樣我們可以鎖定交易應當具有的屬性:

          這個交易例子非常的簡單,僅僅包含了發起方(fromAddress)和接受方(toAddress)以及數量。如果有需求,你也可以在里面加入更多字段,不過這個只是為了最小實現。

          調整我們的區塊鏈

          當前的最大任務:調整我們的區塊鏈來適應這些新變化。我們需要做的第一件事就是存儲待處理交易的地方。

          正如你所知道的,由于 POW,區塊鏈可以穩定的創建區塊。在比特幣的場景下,難度被設置成大約每 10 分鐘創建一個新區塊。但是可以在創造兩個區塊之間提交新的交易。

          為了做到這一點,首先需要改變我們區塊鏈的構造函數,以便他可以存儲待處理的交易。

          我們還將創造一個新的屬性,用于定義礦工獲得多少錢作為獎勵:

          下一步,我們將調整我們的 addBlock()方法。不過我的調整是指刪掉并重寫它!我們將不再允許人們直接為鏈上添加區塊。相反,他們必須將交易添加至下一個區塊中。

          而且我們將 addBlock()更名為 createTransaction(),這看起來更語義化:

          挖礦

          人們現在可以將新的交易添加到待處理交易的列表中。但無論如何,我們需要將他們清理掉并移入實際的區塊中。

          為此,我們來創建一個 minePendingTransactions()方法。這個方法不僅會挖掘所有待交易的新區塊,而且還會向采礦者發送獎勵。

          請注意,該方法采用了參數 miningRewardAddress。如果你開始挖礦,你可以將你的錢包地址傳遞給此方法。

          一旦成功挖到礦,系統將創建一個新的交易來給你挖礦獎勵(在這個栗子里是 100 枚幣)。

          有一點需要注意的是,在這個栗子中,我們將所有待處理交易一并添加到一個區塊中。但實際上,由于區塊的大小是有限制的,所以這是行不通的。

          在比特幣里,一個區塊的大小大概是 2MB。如果有更多的交易能夠擠進一個區塊,那么礦工可以選擇哪些交易達成哪些交易不達成(通常情況下費用更高的交易容易獲勝)。

          地址的余額

          在測試我們的代碼前讓我們再做一件事!如果能夠檢查我們區塊鏈上地址的余額將會更好。

          測試

          好吧,我們已經完成并可以正常工作。為此,我們創建了一些交易:

          這些交易目前都處于等待狀態,為了讓他們得到證實,我們必須開始挖礦:

          當我們開始挖礦,我們也會傳遞一個我們想要獲得挖礦獎勵的地址。在這種情況下,我的地址是 xaviers-address(非常復雜!)。

          之后,讓我們檢查一下 xaviers-address 的賬戶余額:

          我的賬戶輸出竟然是 0?!等等,為什么?難道我不應該得到我的挖礦獎勵么?如果你仔細觀察代碼,你會看到系統會創建一個交易,然后將您的挖礦獎勵添加為新的待處理交易。

          這筆交易將會包含在下一個區塊中。所以如果我們再次開始挖礦,我們將收到我們的 100 枚硬幣獎勵!x`

          局限性與結論

          現在我們的區塊鏈已經可以在一個區塊上存儲多筆交易,并且可以為礦工帶來回報。

          不過,還是有一些不足:發送貨幣時,我們不檢查發起人是否有足夠的余額來實際進行交易。

          然而,這其實是一件容易解決的事情。我們也沒有創建一個新的錢包和簽名交易(傳統上用公鑰/私鑰加密完成)。

          這絕不是一個完整的區塊鏈實現!它仍然缺少很多功能。這里只是為了驗證一些概念來幫助大家了解區塊鏈的工作原理。

          一步:繪制出一個小正方形

          1、html代碼

          <div class="ico"> </div>

          2、css代碼

          .ico{ width:50px;height:50px; background:red; }

          產生結果:

          第二步:給小正方形加上不同的邊框顏色

          1、css樣式

          .ico{width:50px; height:50px; background:red; /*新增內容*/ border:20px solid blue;}

          產生的結果:

          第三步:給上邊框單獨加上一個顏色

          1、css樣式

          .ico{width:50px;height:50px; background:red; border:20px solid #6600ff;/*新增內容*/border-top:20px solid #000000;}

          產生的結果:

          第四步:把長方形的寬度和高度從原來的50px 改為0px

          1、css樣式

          .ico{/*--修改部分*/width:0px; height:0px; background:red; border:20px solid #6600ff;	border-top:20px solid #000000;}

          產生的結果:

          第五步:把邊框的顏色設置為透明的,只留上邊框的顏色為黑色

          1、css樣式

          .ico{width:0px;height:0px; background:red; /*修改的樣式*/border:20px solid transparent;;border-top:20px solid #000000;}

          產生的結果:

          解釋:當邊框變為transparent透明后,出現紅色的區塊,是因為我們在構建長方形時加紅色的背景 background:red,最后一步,去掉background:red;就可以了

          第六步:把background:red;去掉

          .ico{width:0px;height:0px; /*background:red;*/ border:20px solid transparent;border-top:20px solid #000000;}

          產生的結果:

          終于一個完整的三角形制作出來了,寫的步聚有點多,主要是想讓大家看到這個三角形是如何演變而來的。

          如果沒有看懂,或有代碼方面問題的,可以加群:611428142 來聽我講課吧

          想繪圖插件5.2(MxDraw5.2)


          夢想CAD是專業的CAD插件(控件),經過10年研發,可輕松在網頁、手機及BS/CS程序中使用CAD和瀏覽編輯DWG文件,不需安裝AutoCAD即可運行。

          控件核心代碼使用VC++ 2010開發,至今已有三十萬行代碼規模;2007年發布第一個Release版本,經過多年的版本更迭與技術沉淀,控件已經十分快速穩定。在關鍵的 空間搜索 上使用了復雜度極低的算法,并且使用 匯編 優化,可以處理50萬級的實體,圖形的顯示和處理效率比同類產品高出很多。


          夢想繪圖3d插件6.0(MxDraw6.03d)


          使用二位控件的顯示核心,基于 OpenCASCADE幾何造型引擎 ,創建錐、柱、環等基本幾何體,對幾何體進行 布爾操作 ,如:相加、相減、相較、倒角、斜切、鏤空、偏移、掃視;幾何 空間關系計算 ,如:法線、點積、叉積、投影、擬合;幾何體分析,如:質心、體積、曲率; 空間變換 ,如:平移、縮放、旋轉。


          夢想繪圖手機版插件6.0(MxDrawAndroid6.0/MxDrawIOS6.0/)


          使用二維控件的顯示核心,并專對手機顯示CAD圖紙做了極速優化 ,是目前手機上顯示DWG文件非常快的控件。


          夢想CAD軟件5.2(MxCAD5.0)


          使用二維控件的顯示核心,完全自主的二維CAD繪圖軟件,程序簡潔、運行快速、功能齊全、穩定可靠;兼容 所有版本的DWG文件 ,支持 ARX的二次開發接口。


          安裝包下載


          點擊此處下載

          運行環境

          支持以下的32/64平臺的系統:WindowsXP、Windows2000、WindowsVista、WindowsServer、Windows7、Windows8、Windows10。


          支持以下的瀏覽器:IE所有版本、火狐、谷歌4.5及以前的版本、360瀏覽器(兼容模式)、QQ瀏覽器。


          1

          QQ瀏覽器使用了最新的谷歌瀏覽器內核,可使用QQ瀏覽器代替谷歌瀏覽器運行控件

          支持語言

          網頁使用,支持 IE所有版本

          控件支持如下的語言進行二次開發:VC、VB、CSharp、Delphi、HTML、ASP、JAVA、JavaScript、C++、 Builder、PHP、.Net、易語言、PowerBuild等。

          編程接口

          有一萬多個接口函數 可供調用,提供Object Arx,AutoCAD VBA、COM開發接口,與AutoCAD二次開發類似的接口。

          文件格式

          控件支持自定義文件格式,擴展名為.mxg,mxg文件 穩定可靠 ,能 完整呈現DWG文件 ,支持圖紙預覽,加密;支持DWG、DXG、BMP、JPG、PNG、DWF、PDF、GIF、ICO DGN、SHP等。

          支持SHX、TrueType字體。

          控件與AutoCAD兼容,支持AutoCAD R14至AutoCAD 2017的 所有DWG圖紙格式 ,并保證能支持將來新出現的AutoCAD文件格式。

          網絡功能

          在控件支持的瀏覽器(見 運行環境 )中,控件可瀏覽服務器上的DWG文件,把DWG文件保存到服務器、在服務器后臺運行控件、把DWG轉成其他格式、提取信息等;支持FTP連接,二進制數據流加載。


          在網頁中使用控件演示

          主要功能

          DWG批量轉到PDF、DWF,圖紙信息搜索提取,測距離,算面積,圖章, 批注 ,捕捉,正交,實體閃爍,曲線離散,偏移,打斷,陣列,擴展數據讀寫,擴展記錄讀寫,構造選擇集,打印, 動畫自定義實體 ,組,右鍵菜單, 超連接 ,Undo,Redo,字典,圖層,標注樣式,線型樣式,文字樣式,視口,布局, 用戶坐標系 ,系統變量,圖紙比較,圖紙剪切,界面切換,動態提示,google百度地圖等。

          打印功能

          框選、全屏打印、后臺批量打印、多個 圖紙嵌套打印 、與 網頁合并打印 等。

          顯示功能

          鳥瞰、放大鏡、視區平移、縮放、視區旋轉、鷹眼、 透明顯示 、背景、水印、網格、回溯顯示、最佳顯示、顯示/隱藏工具條、瀏覽模式、 分屏顯示 、矢量線、矢量圓、 動畫 、動態標注、疊加對比顯示等。

          圖元支持

          主要實體有:直線,圓弧,Polyline,樣條線,圓,橢圓,橢圓弧,IMAGE,點,塊引用,外部塊參照,射線,云線,文本,多行文本,對齊標注,旋轉標注 ,半徑標注,直徑標注,角度標注,OLE對象,布局,視口,圖層,線型,文字樣式,命名字典,標注, 自定義實體 ,代理實體, 反應器 等。主要編輯有:移動,夾點拉伸,偏移,刪除,復制,粘貼,旋轉,縮放,鏡向,離散,圖案填充,實心填充,打碎,計算曲線長,面積,最jin點,交點,導角, 文字變線條 等。

          編輯支持

          移動、夾點拉伸、偏移、刪除、復制、粘貼、旋轉、縮放、鏡向、離散、圖案填充、實心填充、打碎、計算曲線長、面積、最近點、交點、倒角、文字變線條等。

          幾何運算

          面積,夾角,向量,矩陣,旋轉,縮放,最進點,最進距離,垂足,參數,鏡向,平移,交點,打斷,延伸, 最短路徑最長路徑

          支持事件

          鼠標事件鍵盤事件 ,選擇修改,夾點編輯,打圖紙完成,命令開始,命令執行完成,視區變化,動態提示,動態繪制,超連接點擊,對象修改,命令執行,進度條變動,系統變量修改,控件初始化完成,等事件。


          主站蜘蛛池模板: 国模吧一区二区三区精品视频| 国产精品成人99一区无码| 国产精品第一区第27页| 精品国产一区二区三区麻豆| 国产91大片精品一区在线观看| 日韩免费一区二区三区在线播放| 亚洲欧美日韩中文字幕在线一区| 国产精品亚洲一区二区三区在线观看| 国产一区二区精品尤物| 精品国产日韩一区三区| 韩国福利视频一区二区| 人妻夜夜爽天天爽一区| 国产一区二区三区在线观看精品| 久久久久人妻精品一区二区三区| 人妻互换精品一区二区| 国产视频一区二区在线播放| 精品一区二区三区在线视频观看 | 国产成人一区二区三区高清| 久久综合一区二区无码| 好吊妞视频一区二区| 熟妇人妻AV无码一区二区三区| 国产乱码精品一区二区三| 国产精品久久久久久一区二区三区 | 国产韩国精品一区二区三区 | 亚洲av高清在线观看一区二区| 精品一区二区视频在线观看| 免费萌白酱国产一区二区三区| 精品国产亚洲一区二区在线观看| 国产一区在线视频| 亚洲AV成人一区二区三区在线看| 中文字幕久久久久一区| 精品国产乱子伦一区二区三区| 精品视频一区二区三区四区| 天天综合色一区二区三区| 免费国产在线精品一区| 国产99精品一区二区三区免费 | 国产视频一区在线播放| 一区二区免费国产在线观看| 国产一区二区影院| 无码国产精品一区二区免费3p| 午夜性色一区二区三区免费不卡视频|