初窺位元幣

2022-07-31 19:27:13 字數 3733 閱讀 1959

寫這篇文章是為了讓我的一位策劃同事能夠理解位元幣、區塊鏈這些概念。他並不是計算機相關專業的,因此我需要寫的盡可能簡單,這是個很大的挑戰。

另外,本人學識有限,若有問題望指出。

什麼是貨幣?

貨幣是用於衡量物體價值的東西。在進行交易的時候,我們並不是以物易物,而是將物品換算成等價的貨幣。交易的一方支付貨幣,另一方支付需求的物品。可以很好理解使用貨幣的好處,具體本文不作討論。

什麼東西適合作為貨幣?

早期,人們使用***作為貨幣,***的特定是穩定(適合儲存)並且總量稀少(也可以理解為總量相對恆定)。總量恆定同時意味著**較為穩定,這對貨幣來說十分重要。試想一下,如果使用鐵塊作為貨幣,那麼隨著煉鐵工藝的提公升和更多的鐵礦資源被發現並開採,你我手中的貨幣就會迅速貶值。這當然是不可以接受的。

然而,使用***也是有缺點的,比如不便攜帶、不易被切分等。於是人們發明了紙質貨幣。紙質貨幣比較特殊,它是基於使用者對某一機構、國家的信任來發行的。使用者相信紙質貨幣是不會被隨意增發的,因此接受這張特殊的紙來作為交易的貨幣。

至此,相信已經看出傳統紙質貨幣的問題了。問題的核心在於信任,當被信任的一方默默的增發貨幣時,你我口袋裡的錢被悄無聲息的拿走並轉移到另乙個人的手中,而我們對此卻是束手無策。因此,比起人為的約定,我更願意相信基於密碼學原理工作的位元幣。

什麼是位元幣?

位元幣是一種去中心化的電子貨幣。去中心化解決了傳統貨幣基於信任的問題,位元幣並不是依賴於某個機構,而是依據一套數學原理來做到了數量恆定。當然位元幣還有其它的優點,比如交易的匿名性。在進行交易時,大家能看到的僅是,賬戶a支付x位元幣給賬戶b這種資訊,並不知道賬戶a、b具體是誰。這是因為乙個賬戶實際上就是乙個公鑰,只要建立乙個公鑰即可進行交易,不需要什麼實名驗證。

在介紹實現原理之前,需要先說一下需要用到的一些基礎知識。

非對稱加密是這樣的,我手上持有兩個金鑰(兩串數字),分別是公鑰和私鑰。公鑰是公布出去並且大家都知道的,而私鑰則是藏起來只有自己知道的。這兩個金鑰的特點是,使用公鑰加密的密文必須通過私鑰解密,對應的,使用私鑰加密的密文也需要公鑰解密。

一般我們使用雜湊演算法(hash)來驗證資料的完整性。hash演算法為給定的乙個段資料生成乙個摘要(指紋)。hash演算法的特點是,哪怕資料只有一小部分被修改,生成後的摘要也是差別巨大。因此,通過對摘要做比較的,即可驗證資料是否相等,是否被修改過。

數字簽名技術使用了上述提到的非對稱加密和雜湊演算法。考慮以下這種情況,a想要向b支付x位元幣,於是它在賬單上寫上類似於這樣的東西:

//

from: a

//to: b

//how much: x

寫好這些資訊後,a需要把這份賬單發出去。於是問題就來了,b收到這份賬單時,怎麼能夠獲知這個賬單是出自於a的,而不是其它某個人以a的名義偽造的乙份呢?

因此,我們需要一種方法能夠證明,這份賬單確實是a發出來的,並且在它被發出後沒有其它人對這上面的內容作出任何修改。

數字簽名就是為了解決這種問題。具體流程如下:

(1)a在生成賬單時,先使用雜湊演算法h為賬單生成乙份摘要da,再使用自己的私鑰對摘要進行一次加密得到結果c。並將加密的結果c隨著賬單一起發給b。

(2)b在收到賬單時,使用同樣的雜湊演算法h計算賬單的摘要db,然後再用a的公鑰解密c得到了da。

由非對稱加密演算法可知,乙份資料被a的私鑰加密,僅可通過使用a的公鑰解密。因此,b可以通過比較da和db的值是否相等,來驗證對方是否擁有私鑰,從而對這份賬單進行驗證。

好了,需要用到的知識已經準備妥當了,接下來就是主線了:p

想象一下,使用一般的電子貨幣交易是如何進行的:發起支付時,先從某個特定的資料庫中查詢對應賬戶的餘額,餘額足夠則可進行交易,否則拒絕。但是位元幣不能這麼做,因為在位元幣系統中不能存在乙個權威的中心化資料庫來儲存交易資料。這是為了避免位元幣網路的執行是依賴於某乙個機構、組織、公司的。因此,位元幣使用了一種特殊的方法來儲存交易。

首先,所有的交易資料都被公開。任何人都能獲知位元幣網路開始執行至今的所有交易記錄。通過這份交易記錄,就能夠計算出任何賬戶的「餘額」。

解決了查詢賬戶「餘額」的問題後,接下來的問題就是,如何更新交易資料?如果任何人都有修改交易資料的能力,如何保證這個系統是安全的?如何保證乙個賬戶的餘額是正確的?

這個問題的解決方法有點類似於以前應對垃圾郵件的做法。

解決垃圾郵件的乙個方法是這樣的:

(1)在傳送乙個電子郵件時,需要找到乙個這樣的隨機數。把這個隨機數新增到郵件內容後面,對修改後的郵件進行雜湊,計算得出結果是以"0000"開頭的。

(2)收到郵件時,通過驗證這個隨機數是否符合要求,從而判斷是否是垃圾郵件。

這個方法是利用了垃圾郵件的特點:大量對郵箱掃瞄傳送郵件。

使用這種方法時,要找到這個隨機數,只能乙個個數的去嘗試。但在驗證時僅需要一次計算即可。因此找到這個隨機數的難度遠遠大於驗證。可以想象的是,隨著要求的雜湊計算的結果開頭的0的個數增多,尋找這個隨機數的難度也進一步變大。但是驗證卻是輕而易舉的。

當郵件附帶的隨機數被驗證通過時,隱含的意思就是:這封郵件是耗費了傳送方一定的cpu資源才傳送過來的。因此郵件過濾程式認為它不是垃圾郵件。

上述解決垃圾郵件的方法,其實是要求郵件傳送方為這封郵件給出乙個工作量證明,提高傳送郵件的成本。位元幣使用相同的原理來防止交易資料被隨便修改。

具體來說,位元幣使用區塊鏈來儲存交易資料。而區塊鏈是這樣的一種資料結構:

注:取自於bitcoin: a peer-to-peer electronic cash system

我來解釋一下。交易資料以區塊鏈的結構組織,每乙個區塊(鏈的節點)大致可以理解為儲存了以下的資料:

(1)前乙個節點的雜湊。

(2)當前節點的交易資料集合。

(3)乙個表示工作量證明的隨機數。

通過節點的工作量證明保證了,如果某人想要修改乙個節點的資料,必須要耗費與其相當的工作量(為此修改計算乙個新的工作量證明)。又因為節點之間是通過雜湊值鏈結的,因此在修改過乙個節點之後,不僅要為當前這個節點重新計算,還要為這之後的每乙個節點都重新計算工作量證明。往區塊鏈裡打入新的節點是十分困難的,除非控制了全網51%的計算力,否則沒有人能輕易的往區塊鏈連續打入數個節點。

舉個例子,賬戶a向賬戶b支付x位元幣,則流程大致是這樣的:

(1)a先使用之前提及的數字簽名等技術,為本次交易生成乙份賬單。這個賬單記錄了b的公鑰、交易的金額x和乙個簽名指令碼s(簽名指令碼具體是什麼可以先不管)。

(2)之後a將這個賬單資料廣播給網路上的時間戳伺服器。

(3)時間戳伺服器收集最近一段時間內發生的交易賬單,對收到的賬單校驗併排除掉非法的交易,最後嘗試將這些賬單打入區塊鏈中。而將賬單打入區塊鏈的具體方法是,為賬單集合和當前區塊鏈中最新的節點的雜湊值,計算工作量證明。當找到這個隨機數之後,就公布這個新的區塊鏈。其它時間戳伺服器如果認同這個新的區塊鏈就會選擇跟隨它,並在之後在這個新的區塊鏈下工作。

將賬單打包打入區塊鏈是有難度的,這需要耗費大量的cpu資源去計算工作量證明,並搶在其它人之前將其公布。如果有人趕在你之前公布出計算的結果,那你這一段時間的工作就相當於是白做了。沒有人會願意免費去做這件事,因此需要一些激勵。而位元幣系統的激勵則是,規定了在成功計算到工作量證明後,允許獲得一定數額的位元幣。具體操作是這樣的,時間戳伺服器會把自己應得的那份錢,隨著收集的賬單一起打包打入區塊鏈中。位元幣也就是通過這種方式,從無到有的產生出來的。

這一過程有點像淘金:工人們辛辛苦苦把**從地下挖出來,得到的**便是對自己辛勤工作的報酬。之後,淘金工人可以使用所得的**去市場上購買其它東西,於是**就開始在市場流通了。因此,時間戳伺服器將交易打包進區塊鏈這一行為又被稱之為挖礦。

位元幣 位元幣的實現

位元幣系統是乙個基於交易的賬本,這意味著儲存在賬本中的是一筆筆交易。那麼在使用者進行轉賬交易時,首先就需要確保使用者所持有的數量要大於或等於將要交易的。這要做的目的是為了避免雙花問題。這種基於交易的賬本好處在於隱私保護性比較好,缺點在於每次交易都需要說明幣的 在位元幣的全節點中,會在記憶體中維護乙個...

Scrapy 初窺筆記

scrapy startproject yourprojectname 建立scrapy專案 開始爬蟲 scrapy crawl spidername 開始執行爬蟲 以上仿麻煩 根目錄新建執行檔案 from scrapy.cmdline import execute execute scrapy c...

初窺Shell 指令碼

1 shell是什麼 shell指令碼就是利用shell的命令解釋的功能,對乙個純文字的檔案進行解析,然後執行這些功能,也可以說shell指令碼就是一系列命令的合集。shell可以直接使用在win unix linux上面,並且可以呼叫大量系統內部的功能來解釋執行程式,如果熟練使用並掌握shell指...