2020年技術總結——區塊鏈
- 區塊鏈基礎
- 大綱
- 哈希演算法
- 橢圓曲線加密
- CAP BASE
- 區塊鏈資料結構
- 共識協議
- 區塊鏈進階
- 大綱
- 如何使用JAVA開發一款位元幣(或其他幣種的)錢包?
區塊鏈基礎
大綱
學習區塊鏈,要解決的問題:
哈希演算法
非對稱加密演算法,例如RSA,ECC橢圓曲線加密
資料結構 例如mercle tree
分布式架構,分布式架構中經典的CAP理論,分布式賬本,
P2P網路通信
位元幣的一個區塊中,包含了什么資訊?
一個區塊是怎樣產生,怎樣加到鏈上的?
P2P系統的共識演算法有哪些?位元幣采用的Pow演算法是怎樣實作的?
每個節點中記錄了多少區塊鏈的資訊?輕節點和全節點的區別?
位元幣原始碼大部分是使用C++開發的,
位元幣腳本是一種獨特的語言
位元幣錢包可以用任意編程語言實作,用Java也可以,
以太坊平臺編程語言是solidity,其風格與JavaScript類似,
Fabric框架對Go語言的支持比較友好,
Rust語言是非常新的一門語言,有其獨特優勢,
哈希演算法
1, 什么是哈希演算法?
哈希是hash的音譯,也翻譯作散列函式,不是一種固定的演算法而是一種思想,
哈希演算法可以把任意長度的輸入,經過散列演算法算出固定長度的輸出,
典型的散列函式有無限的定義域,和有限的值域,哈希演算法是不可逆的(hiding),
并非所有哈希演算法都是均勻散列的,但為了減少哈希碰撞,應該把哈希演算法設計為均勻散列,
2, 有哪些常用的哈希演算法?
MD5,SHA-1,SHA-2系列(包括SHA-256)
3, 位元幣采用的是什么哈希演算法?
SHA-256
4, 經過SHA-256演算法的計算會生成多少位的數字?
64位16進制數字,
5, 什么是哈希碰撞?
對于給定的哈希函式和X,計算出H(X),若找到了Y≠X,且H(Y)=H(X),則稱之為哈希碰撞,
哈希碰撞是無法避免的,但可以足夠難,如果一種哈希演算法的人為尋找哈希碰撞足夠難,則
稱為collision resistance,
6, SHA-256具備哪些性質?
SHA-256是一種哈希演算法,所以首先具備hiding的特性,
而且使用SHA-256演算法是很難認為制造哈希碰撞的,代價足夠大,所以具備collision resistance特性
從上述兩個特性推測,我們能夠實作digital commitment
這也是位元幣采用這種哈希演算法的原因,
此外位元幣還要求puzzle friendly特性,就是說給定一個哈希值范圍,我們無法預測輸入是怎樣才能滿足
哈希值屬于該范圍,
橢圓曲線加密
0,非對稱加密演算法需要解決什么型別的數學問題?
要解決正向計算很簡單(多項式時間復雜度),而逆向計算很難(指數級時間復雜度)的問題,
主流的非對稱加密演算法有RSA,ECC等,
1,什么是公鑰私鑰?有什么作用?
公鑰私鑰是一對兒密鑰,用于對明文資訊加解密,其中公鑰是公開給外界的,
私鑰是只有自己知道的,需要保密 ,公鑰加密的訊息只有用私鑰才能解密,
私鑰加密的資訊只有用公鑰才能解密,
2,非對稱加密的加解密程序是怎樣的?
例如A給B發資訊,需要途徑C,在不加密
的情況下,C能看到A對B發的資訊內容,而非對稱加密的程序是這樣的,B公開
公鑰,外界包括A,C都能獲得B的公鑰,A想給B發資訊,首先用B的公鑰對明文
進行加密并交給C,C沒有解密方法,看不到資訊內容,交給B,B用自己的私鑰進行解密,
獲得資訊內容,
3,非對稱加密簽名演算法的程序是怎樣的?
A如何證明發出的訊息是A發出的,而不是別人?
首先A用自己的私鑰對資訊的哈希值進行加密,哈希值和密文發送給B,B使用公鑰解密,
與哈希值對比,一致則證明是A發出的,不是別人,
4,橢圓曲線加密演算法中的橢圓曲線具體指什么?
由方程描述的曲線:y2=x3+ax+b 其中4a3+27b2≠0
5,為什么密碼學上不直接使用橢圓曲線,而是使用有限域上的橢圓曲線?
實數域的橢圓曲線是連續的,有無限個點,運算程序不精確,而密碼學要求有限個點,要求運算精確,
其方程為:y2=x3+ax+b mod p 其中4a3+27b2≠0 mod p
p 為質數,x y a b 為小于p的非負整數,
6,如何根據橢圓曲線上的G點和給定的k,計算kG點?
在G點作切線,與橢圓曲線交叉于A點,則A關于x軸的對稱點為2G點,
連接G和2G點作直線,與橢圓曲線交叉于B點,則B關于x軸的對稱點為3G點,
依次類推,直到求出kG點,
7,如何根據有限域橢圓曲線的G點和給定的k,計算kG點?
相關公式如下: 有限域GF§上的橢圓曲線y2 = x3 + ax + b,若P(Xp, Yp), Q(Xq, Yq),且P≠-Q,
則R(Xr,Yr) = P+Q 由如下規則確定:
public Point plusPoint(P,Q){//偽代碼
Xr = (λ2 - Xp - Xq) mod p //求R點的X值
Yr = (λ(Xp - Xr) - Yp) mod p //求R點的Y值
其中λ = (Yq - Yp)/(Xq - Xp) mod p(若P≠Q), //P≠Q時求引數λ
λ = (3Xp2 + a)/2Yp mod p(若P=Q) //P=Q時求引數λ
return R(Xr,Yr);
}
Point G1 = new Point(0,1); //舉例說明,求G1(0,1)點的kG1
Point kG1 = new Point(0,1);
for(int i=0;i<k;i++){
kG=plusPoint(kG1,G1); //多次回圈,呼叫k次plusPoint求得kG
}
8,有限域橢圓曲線加密演算法中的公鑰私鑰分別指什么?能否根據公鑰和G計算私鑰?
k和kG,其中公鑰kG記為K,
根據私鑰計算公鑰難度較低(多項式計算),
根據公鑰和G計算私鑰難度為指數級,幾乎不可能,
9,有限域橢圓曲線加解密的程序是怎樣的?
明文message記為橢圓曲線的點M(明文嵌入,有相關演算法支持)
形成一個亂數r
加密者已知:M r G K
加密程序是形成點對C={rG,M+rK}
解密者收到C,已知k,G
解密程序:M+rK-k*rG=M+rkG-rkG=M
10,有限域橢圓曲線簽名加解密程序是怎樣的?
發送者(已知私鑰k,公鑰K = kG,G點(x,y))有訊息M,首先對M求哈希h,并準備一個亂數r,
s = (h+kx)/r,簽名{rG,s}
發送M和簽名{rG,s}給接收者,
驗證程序:
求得M的哈希值h,
求(hG+Kx)/s = (hG+kGx)?/(h+kx) = rG(h+kx)/(h+kx) = rG
若求得的rG和接收到的rG一致,則證明發送者身份真實,
11,位元幣選擇的是什么曲線?
實際應用中,我們并不需要關心橢圓曲線的眾多引數如何選取(要選對引數對于普通使用者來說
并不現實),只要從密碼學家們精心挑選的一堆曲線中選擇一個就行了,一般來說曲線Curve25519,
prime256v1是比較常用的,位元幣選擇secp256k1則是因為它效率較高,并且其引數是可預測的,
降低了包含后門的可能性,
G點怎么取?
位元幣中的G點是一個常數,對于所有位元幣用戶來說都是同一個,
12,位元幣的錢包地址和公鑰有怎樣的關系?
錢包地址是公鑰經過哈希和編碼生成的,詳見錢包地址生成圖,

參考:
橢圓曲線加密演算法https://www.jianshu.com/p/e41bc1eb1d81
位元幣地址詳解https://www.jianshu.com/p/a2ea3b44f6eb
關于密碼中的RSA演算法和ecc(橢圓曲線)演算法加密程序是怎樣的?https://blog.csdn.net/love_hot_girl/article/details/81164945
CAP BASE
CAP
C consistency 一致性
A available 可用性
P partition tolerance 磁區容錯性
首先要理解磁區容錯性:P成立:容:允許,允許磁區,允許犯錯,
也就是說允許任意節點之間的網路故障,即節點之間傳輸的訊息丟失這種情況出現,
P不成立:不允許任意節點之間的資訊傳輸丟失,
在分布式系統中,節點之間傳輸資訊丟失是無法避免的,你沒法保證網路那頭不會停電,
也沒法知道他掉線是因為他媽媽拔了網線,
所以分布式系統一定要磁區容錯,允許分布式系統中的節點宕機掉線,
C 是一致性,即分布式系統中的各個節點的資料應保持一致,
如果強調一致性,則每次節點收到寫請求并寫入新資料,
會鎖定其他節點的讀寫操作并要求其他全部節點都同步資料,資料一致之后才解鎖,
考慮到磁區容錯性的存在,則過于強調C可能會導致同步操作的時間很長而影響可用性,
A 是可用性,即發送的請求能比較快的收到回應,
強調A可用性,則需要犧牲一些一致性,
C和A之間不可能完全同時滿足,需要權衡,找到一個平衡點,
這就引出了BASE理論,
核心思想是:既然無法做到強一致性,那么就讓分布式系統中的每個節點(應用)根據
自身特點,采用適當的方式來使系統達到最終一致性,
Basically Available 基本可用
Soft State 軟狀態
Eventually Consistency 最終一致性
最終一致性指的是分布式系統經過一定時間后能夠讓節點之間資料達到一致,最終兩個字很微妙,
因為系統達到一致所經歷的時間可能是幾毫秒,也可能是幾個小時,
軟狀態指的是在系統達到最終一致性之前存在的,各個節點之間資料可能不一致的狀態,
基本可用指的是系統雖然出現了一些不可預知的故障,但基本上還是能用的,只是相比于正常系統
而言,會有回應時間上的損失或功能上的損失(如引導到降級頁面),
在實踐當中,應根據系統業務具體特點權衡取舍,
例如銀行轉賬強調的是一致性,要求資料務必準確,
電商搶購可以引導到降級頁面,可以讀到庫存臟資料,但下單時會校驗資料庫中真實庫存并提示庫存不足,
區塊鏈資料結構
1、位元幣的一個區塊包含哪些資訊?
每個區塊首先包含很多筆交易tx[ ~ ~ ~],2020年區塊容量1mb,大約包含4000筆交易資訊,
這些交易的資訊的哈希值通過Merkel Tree生成一個根哈希(欄位mrkl_root),用于Merkel Proof
還包含前一個區塊的哈希值prev_block,(為了保證整條區塊鏈不可篡改)
此外還包含版本號、時間戳、區塊大小、區塊號、高度、隨機值nonce等等很多資訊,
2、什么是Merkel Tree?
個人理解:存盤hash值的二叉樹,作用是通過根節點的一個哈希值驗證全部資料是否正確,
3、在實踐中,我們可以在區塊鏈瀏覽器,通過區塊高度查看區塊資訊,也可以通過交易哈希查看每一筆交易的詳細資訊,我們還可以呼叫開發者提供的API來進行這些查詢操作,
共識協議
1、什么是拜占庭將軍問題?
在有叛軍的情況下,將軍們如何通過信使傳遞資訊并達成一致的問題,
叛軍數目不可以超過比例,否則會達不成一致,比例高到一定程度甚至會達成錯誤共識,
設將軍數N,含叛變將軍數f,達成一致的條件為:N>3f+1
驗證:假設4個將軍,含1個叛軍,
2、解決拜占庭將軍問題的演算法是?
PBFT演算法
3、位元幣采用什么共識演算法?
Pow proof of work 作業量證明,
4、挖礦和記賬的程序是怎樣的?
區塊鏈可以看作一個分布式的賬本,全節點,一般是大型礦場,具備完整的賬本,
挖礦的目的是獲取記賬權的,記賬的時候可以記錄一筆原本不存在的位元幣給自己,相當于鑄幣,
挖礦的具體程序:礦工首先打包一個區塊,區塊中包含很多筆交易,然后不斷隨機生成nonce值并計算區塊哈希值,試圖使區塊哈希值滿足<目標閾值target,一旦找到合適的nonce,則向其他節點廣播,得到其他節點驗證和認可后,礦工就會把區塊寫入區塊鏈,而其他礦工節點則會洗掉這個區塊中有,自己也有的交易,保留這個區塊中沒有,自己區塊中有的資料,重新打包和計算,
區塊鏈進階
大綱
區塊鏈進階實戰:
1、如何使用Java開發一款位元幣錢包?
1.1、如何用Java生成位元幣公私鑰對和錢包地址?
2.2、如何用Java發起位元幣轉賬?
2、位元幣如何挖礦?以太坊如何挖礦?嘗試以太坊挖礦并獲取收益,
3、以太坊平臺如何開發DAPP?
4、用Java實作區塊鏈,實作位元幣系統,
如何使用JAVA開發一款位元幣(或其他幣種的)錢包?
作業原因,完成了一款交易所波場錢包的開發,這里以波場為例講一下錢包開發的思路,
錢包要實作的基礎功能包括:
掃描區塊獲取區塊資訊;
離線生成公私鑰對兒和地址;
離線打包一筆交易并簽名;(這里包括trx和合約代幣,兩者有很大區別)
發布廣播,把交易發布上鏈;
錢包要實作的業務功能包括:
生成地址池;
用戶系結地址;
回寫;(
根據資料庫中塊高掃描指定區塊的交易資訊,取出轉入地址欄位value,與資料庫中取出的用戶錢包list進行比對,如果匹配上,證明用戶充值進來了,把充值交易資訊存入資料庫,
)
歸集;(
代幣歸集比較復雜,因為代幣的轉賬需要消耗trx作為手續費,以usdt為例,首先取交易哈希,到鏈上查詢交易是否成功,如果交易成功再進行下一步,
把成功的交易存入一個待處理的佇列,
從佇列中取出來一筆交易的轉入地址,查詢該地址中手續費是否充足,
如果充足,則進行下一步,如果不足,則轉入一定量的trx作為手續費再進行下一步,
把該地址中的usdt轉入歸集主賬戶,
從佇列中把這筆交易洗掉,把回寫表中的歸集狀態更新為已經歸集,
)
入賬;(
定時任務中,取出狀態為:已歸集、未入賬的交易,根據交易地址找到資料庫中的用戶及用戶錢包表,根據交易數量給用戶錢包增加余額,最后把交易狀態更新為已入賬,
)
提現自動打幣;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/250269.html
標籤:區塊鏈
