位元幣技術細節理解與記錄

2021-08-20 09:40:36 字數 1810 閱讀 3272

維基百科上比較清晰的描述:本文更多是我對這篇文章的讀書筆記,位元幣的源**我一行也沒有看過。閱讀本文需要對一些基本的演算法或者專有名詞有了解,包括加密演算法,hash,p2p等。

將位元幣作為產品來看,最核心的場景就是完成交易,如下圖:

上圖描述了位元幣認可的交易場景(ecdsa):當節點1想要轉賬給節點2的時候,節點1會發出一條交易,這個交易記錄中除去轉賬金額,交易id等基本資訊之外,最最重要的就是節點1的簽名,即類似於支票的簽名。節點1使用節點2的公鑰和轉賬貨幣的上一筆源頭交易(要花的錢從哪來的)id,通過hash得到hash值,並使用自己的私鑰進行加密,得到最終的簽名,證明這筆轉賬經過了自己的認可。其他節點可以使用節點1的公鑰來解密這個簽名,再使用節點2和上一筆交易的id兩者的hash進行簽名驗證。

當這個場景發生,並且被多個位元幣系統節點驗證並將此交易所在的區塊追加到自己的區塊鏈上,則該系統就完成了一次交易,最終的實際結果就是貨幣財產在節點賬戶之間的轉移。

交易的發生直接依賴於加密演算法和hash演算法,包括橢圓曲線加密和sha256;其次還需要p2p通訊實現交易雙方的溝通;通過hash演算法來實現同一賬戶參與的交易之間的鏈結,以計算賬戶餘額,確保支付者有能力完成交易;最後需要共識機制來讓交易最終被認可。

加密演算法

首先是實現交易簽名,每乙個節點都擁有一組使用橢圓加密演算法生成的公鑰和私鑰,通過私鑰可以生成公鑰,反之不成立。節點在交易簽名場景中使用私鑰加密,其他節點可以使用對應公鑰解密來驗證(非對稱加密的另乙個普遍用途是密文傳輸場景,即公鑰公開,用來加密原始資訊,對應私鑰用來解密,來實現密文的傳輸)。公鑰還與錢包的位址生成直接相關,而公鑰又是通過私鑰生成,所以作為位元幣系統來說,節點的認證登入於與私鑰息息相關,所以一定要確保自己私鑰的安全性。

p2p通訊

所謂p2p,即該系統中所有的節點都是對等的,不存在某個節點異常會影響其他節點或者整個網路的情況。在位元幣系統中,當乙個新的節點加入後,需要先和其他節點進行通訊來同步乙份自己的區塊鏈賬本。位元幣的客戶端維護了乙個活躍節點列表,新節點可以選擇訪問這些節點。當然,也可以通過命令列引數指定節點進行通訊。

節點需要具有廣播的功能,比如當發生一筆交易的時候,節點需要其他節點來驗證交易的正確合理性,以及讓礦工將這條新的交易記錄加入到新產生的區塊中。但是節點與網路中所有其他節點都建立通訊連線是不合理的,也十分耗費資源,所以採用類似於病毒傳播的方式,通過與初始節點建立了通訊的節點不斷擴散到其他節點。

共識機制

因為區塊鏈系統處於p2p網路中,節點之間的通訊存在延遲,對於一些重要事情的完成,節點之間如何達成共識是很核心的問題。所謂共識機制,就是所有節點對於一段時間內某些影響全域性的事件發生的先後順序達成一致的演算法。當前幾個很經典的共識機制包括pow,pos,dpos,pbft等。

位元幣使用的演算法是pow,即proof of work。位元幣系統中所有的交易記錄都是儲存在區塊中,區塊的生成依賴於乙個隨機數的hash,該演算法得到滿足條件的結果是有一定概率的,但是計算的速度是依賴於計算機本身的效能。第乙個計算出合適隨機數的節點可以生成區塊,收納所有上乙個區塊產生之後發生的交易到區塊中,並最後可以獲得token獎勵。

hash演算法

就像上面說到的,hash演算法幾乎無處不在:交易的生成,區塊的生成,甚至是公鑰的生成。而hash演算法可以將大量資料的對映固定大小的唯一值(此過程一般不可逆)。而原始資料的少量更改會在雜湊值中產生不可預知的大量更改。位元幣系統中最常見的hash演算法是sha256。

堆技術細節與堆排序 原創

參考 資料結構 堆 堆排序 堆是具有以下性質的完全二叉樹,每個節點的值都大於或等於其左右孩子節點的值稱為最大堆,反之為最小堆。注意 沒有要求節點的左孩子的值和右孩子的值的大小關係。1,堆使用陣列實現,不是結點和指標。2,堆的屬性可以讓堆和陣列元素直接對應起來 這個陣列arr邏輯上就是乙個堆。從這裡我...

重溫Servlet的技術細節 請求與響應

servlet處理http get post請求 get和post請求的區別 get請求 注意最後一行是空行 post請求 以下是post請求body name computer num 1 httpservlet類service方法 備註request.getparameter 引數名 根據引數名...

iOS前端與後台互動技術實現及技術細節

前言 今天由我給大家進行一場技術分享,分享的主題也是大家還沒有工作或者才去工作不久或者是正處於試用期的同學非常關心的乙個問題,就是我們做 ios,html5,安卓等 前端開發 的如何跟我們的公司後台進行互動.面臨後台我們應該說些什麼?應該怎麼去規避一些不該屬於自己的任務而被後台強加於自己?等等問題。...