跳到主要內容

BlockChain


最近Bitcoin 非常火熱, 仲已經突破10000 美元。 令到一向對電子貨幣不熱衷的我 也想了解一下甚麼是Bitcoin 及它是如何發挖出來。
  經過一輪網上搜查, 發現Bitcoin 是 Blockchain 技術推行下的副產物。 是通過參與Blockchain 活動而獲得的獎勵。
至於甚麼是Blockchain, 我在Medium 文章中找到一篇有關Blockchain 的文章, 原作者利用簡單的事例來解說甚麼是Blockchain。   因此, 我相信對於資訊科技不熟識的讀者們, 也能夠通過閱讀這篇文章, 理解Blockchain 這種技術的概念。

原文: https://hackernoon.com/wtf-is-the-blockchain-1da89ba19348

但由於原文是英文的關係。 對於英文不太好的讀者們應該很吃力才能閱讀完整篇文章。 但好文不應該受限於語言。 所以我在本文中把上述文章中所講述的Blockchain 概念, 在以下部分簡單地講述一次, 好讓大家也能享受好文。

甚麼是Blockchain

Blockchain 其實就是一種利用分步式方法來紀錄一連串網絡交易的技術。 把交易資料紀錄在各自的檔案中。 所謂的Block(本文中的Page) 是指紀錄交易的檔案。 而當Page的容量存滿後再產生新的Page 來紀錄交易的過程就像是一段永不間斷的鏈(chain) 我想這就是叫做Blockchain 的原因了(XD)

解釋得很抽象?? 來看看以下的情境吧!
試想像你在銀行匯款給朋友或家人, 銀行的職員會把這次的交易資料紀錄下來。 最簡單的一筆交易紀錄包括的資料有金額、匯款人、收款人和交易時間。 而保持這筆交易紀錄的人 就是第三方的銀行。
而在Blockchain 中, 則是相反。 保持這筆交易的人則是在同一網內的交易者。 即是自己紀錄。

同一網內??
簡單內說, 就一是群想進行交易和紀帳的人(可以是家人, 朋友或陌生人) 組成一個網絡, 大家只會對交易紀錄, 但大家不會知道大家的真實身份。  而在這個網絡內進行的交易,都是由這個網絡內的每一人紀錄。 如A君向B君 匯款 則每位人士都會檢驗A是否有足夠的金錢進行匯款。 如檢驗後的結果為足夠的話, 大家會把這筆交易紀錄在各自的檔案中(檔案大小有限制) 
當檔案填滿時, 則需要創建新的檔案再進行交易。 但在創建新檔案之前,會先進行一個動作。 就是使用大家都同意的方式把這個檔案封存。 這就類似我們在日常書信中, 書寫完後把信放在信封內並蓋上印章。 以便別人不能打開信件。 這個動作, 我們先暫稱為封口。

封口方式

封口的方式就是網路內的人利用相同的算法 把檔案內容通過猜試的運算, 找出能令其運算出來的結果頭3位為000 的數字。
例如, 將要封口的檔案內容只寫有20893這個數字, 則現在需要做的就是找出能令20893 這個數字經過運算後得出的結果頭3位為000 的數字。 如此時網內的人有人稱答案是21191的話。
則他/她會在網內廣播答案, 其他人收到廣播後 便使用這個數字進行驗算。 如所有人的驗算是正確的話 則使用這個21191 的數字作為 印章 把檔案封存。

但若有人宣稱答案是不正確的話呢?
一般來說, 這種情況很少發生。 除非紀帳人在紀帳過程中出錯或嘗試制造假數欺騙其他人。 在這種情況下, 若他/她想繼續留在這個網內進行紀帳的話, 則他/她需要 抄取其他人的檔案並覆蓋自己原本的檔案再次進行驗算及封口,否則他/她便不能夠繼續留在這個網絡內進行交易及紀帳。

Bitcoin 的產生

由於封口所運行的算法耗時很長。 非常消耗CPU及電力。 所以, 為了吸引人們參與這個活動, 第一位找出封口數字的人會獲得相對應的獎勵。 而這個獎勵就是今日的Bitcoin 或其他虛移貨幣。

能否修改過去紀錄

當檔案封口後, 如有人想對page 的內容作出修改, 則會令到page 的內容和封口數字進行算法運算後再得不出頭3位為000的數字。 這樣, 在這個網內的人知道這個檔案已被修改。 變得不再可信。

當然, 在現實生活中, 算法的輸入方不只是檔案內容和封口數字, 當第一個檔案封存後, 後續的檔案封存也要依靠上一次封存過程中所產生的輸出,也就是頭3位為000的數字 ,作為輸入。
就這樣, 前一次的輸出為下一次運算的依靠條件, 形成一條很長很長的交易鏈。 我們所稱的Blockchain 就出現了。 由於後續的封口過程也需要上一次封口過程的輸出作為輸入。 所以若有人想對之前的紀錄進行修改的話, 他/她需要把後續的紀錄全數修改才能使封口數字能對上。  否則他/她需要脫離這個Blockchain, 因為他/她的後續紀錄已對不上了。
由於計算封口數字過程耗時很久, 所以修改便變得貌似不可能。 但不要忘記, 當進行修改的一方擁有很強的運算能力的話, 即Blockchain上大部份人都是騙子, 則你所擁有的正確交易紀錄便變得毫無意義了(XD)


留言

這個網誌中的熱門文章

如何使用Macbook 進行W-Fi 竊聽及信號分析

OS X 中的Wi-Fi Analyzer 工具 要對無線網絡進行分析及診斷, 首先要在PC中安裝Wi-Fi Analyzer 應用程式。 Wi-Fi Analyzer是一種可以檢察Wi-Fi 信號強弱,找出適合架設Wi-Fi 的Channel , 搜尋附近Wi-Fi 接點及竊聽經Wi-Fi 傳送的網絡封包(這功能要視乎你的網卡是否支援監控模式)的工具。  在網絡上有不同的Wi-Fi Analyzer 供大家下載。 而在OS X 系統中, 其實已預設安裝了Wireless Diagnostics 程式。   在本文中, 會假定讀者對Wi-Fi 的專業名詞(如noise, ssid bssid 等)有基本的認識。 因此, 只會展示Wireless Diagnostics 的操作方法 。  Wireless Diagnostics  Wireless Diagnostics  是一個預設安裝在 OS X 系統的Wi-Fi 分析工具。 用戶可透過它的GUI 介面操作。  在主畫面中,按下option 鍵並點擊在上角的Wi-fi標記會出現Open Wireless Diagnostics。 然後點選它。 點擊工具列中的Window。 並會出現以下選項 如圖 1. Info     點取Info, 會顯示你現在所使用的Wi-fi資訊。 包括它的BSSID,Mac Address,Channel, Network Interface  等等資訊。 如下圖 2. Logs 點選Logs的話, 你可以選取想要收集的網絡介面日誌資訊。 要注意這設定需要重啓電腦才能生效。 並且它是會把收集到的資訊紀錄在電腦中。 因此當你不需要使用時,請記得把它關閉, 以免造成資源浪費。 3.Scan    點選Scan 的話,系統會立即掃描附近的AccessPoint  並列出它們的資料,包括SSID,Mac Address, Noise,RSSI,Channel 等等 資訊。另外系統也會對系統的現時環境作出評估, 列出最合適架設Wi-Fi 的 Channel。 以下圖 圖中的Summary, 就是系統對現在環境的評估。 Total 是系統偵擦到的AccessPoint 數目。 而Best 2.4GHz和Be

C# XML(輸出教學)

C# XML 輸出教學 XML 是其中一種主流的數據儲存格式之一, 在C# 中, 大概有3種不同的寫法把數據輸出成XML 文件。 在本文中, 我會利用一個簡單的Window form 程式介紹這3種不同的寫法。  以下是範例的XML 格式 <Im>    <Number>xx</Number>    <Name> xxx</Name>    <Type> xxx <Type>    <Data> xxx </Data> </Im> 從以上的結構可輕易看得出, 這個範例是把一張圖片輸出成XML 格式。 這是範例中使用的圖片 成功輸出的XML 文件 在Chrome 中顯示 Window form 程式 XML 輸出方法 方法一 首先要介紹的寫法是利用XMLElement 的操作, 在XmlDocument 中構建XML 節點。 上述程式碼先構建一個全新的XmlDocument, 然後逐一構建節點。 最後把構建的節點放到對應的節點或XML Root 節點下。 成功構建後便使用XmlDocument 中的save 方法輸出XML 文件。 以上要注意的事是使用這種方法生成XML 的話, 如遇到要處理圖片的情況。 請先把圖片轉換成base64 字串後, 再放到節點的inner Text 中。 方法二 第二種方法是利用XmlTextWriter 把xml node 按順序寫入Filestream 中。 最後輸出成XML 文件。 程序碼如下, 和方法1相比, 如遇到要處理圖片的情況下, 則只需把圖片的binary data  放到byte 類型的數組中, 再利用XmlTextWriter中的WriteBase64 方法便可。 不用自行轉換成base64字串。 但要留意的事是 由於是使用XmlTextWriter 是把text 以串流的型式輸出。 所以寫入資料流 時最好要按Xml結構的順序寫入。 因為在串流中append 結構是比較困難的事。 方法三 最後一種方法是使用XML.Serialization 空間下的方法, 個人比

C# 的Dynamic Object

C# 的Dynamic Object  介紹 在 .Net 4.0 版本 , C# 引入了動態編程。 實則上它並不是C# 語言的一部分 , 因為它是通過引入Dynamic Language Runtime(DLR library) 來實現的 。 對DLR Library 有興趣的話 可瀏覽( https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/dynamic-language-runtime-overview )  但對於編譯語言(Compiled Language) 來說 ,  引入Dynamic 特性在當時(.Net 4.0 是在2010 發佈的)是一種大躍進 。 雖然 C# 中已有支援動態特性 , 但C# 始終是一種編譯語言 。所以我還是建議如非必要的話,還是不要使用動態編程 。 如果靜態編譯是可以做到這個效果的話就用靜態編譯實現 。 因為使用動態編程的話 , 在編譯時是不會提示你的程式碼會不會有錯誤 , 因此大大增加了執行時出現錯誤的風險 。 而且由於動態編程是late-binding. 所以物件的類別在執行時才會決定 。這種做法相對於靜態編譯是會有執行效率低的問題。 因此 編寫C# 程式應該以靜態編程的方式為主 。 但在以下情況 ,  用動態編程來編寫會較為合適 需要興COM Object 互動 Duck typing 需要與dynamic script language 如IronPython 或Ironruby 等互動 。 以上的情況, 有興趣的讀者可從互聯網中參考,  本文的以下部分會集中 說明C# 中 動態編程的基本語法, 介紹ExpandObject, DynamicObject 和 IDynamicMetaObject 及ExpandoObject 和DynamicObject 的用法。 Dynamic Keyword 若要在C# 中使用dynamic object, dynamic 這個keyword 你是絕對需要知道的 。 當一個變量以dynamic 作為它的型態 。 便代表它是late-binding. 編譯器在執行編譯時不會判斷它的型態 。 因此