A. 以太坊源碼分析--p2p節點發現
節點發現功能主要涉及 Server Table udp 這幾個數據結構,它們有獨自的事件響應循環,節點發現功能便是它們互相協作完成的。其中,每個以太坊客戶端啟動後都會在本地運行一個 Server ,並將網路拓撲中相鄰的節點視為 Node ,而 Table 是 Node 的容器, udp 則是負責維持底層的連接。下面重點描述它們中重要的欄位和事件循環處理的關鍵部分。
PrivateKey - 本節點的私鑰,用於與其他節點建立時的握手協商
Protocols - 支持的所有上層協議
StaticNodes - 預設的靜態 Peer ,節點啟動時會首先去向它們發起連接,建立鄰居關系
newTransport - 下層傳輸層實現,定義握手過程中的數據加密解密方式,默認的傳輸層實現是用 newRLPX() 創建的 rlpx ,這不是本文的重點
ntab - 典型實現是 Table ,所有 peer 以 Node 的形式存放在 Table
ourHandshake - 與其他節點建立連接時的握手信息,包含本地節點的版本號以及支持的上層協議
addpeer - 連接握手完成後,連接過程通過這個通道通知 Server
Server 的監聽循環,啟動底層監聽socket,當收到連接請求時,Accept後調用 setupConn() 開始連接建立過程
Server的主要事件處理和功能實現循環
Node 唯一表示網路上的一個節點
IP - IP地址
UDP/TCP - 連接使用的UDP/TCP埠號
ID - 以太坊網路中唯一標識一個節點,本質上是一個橢圓曲線公鑰(PublicKey),與 Server 的 PrivateKey 對應。一個節點的IP地址不一定是固定的,但ID是唯一的。
sha - 用於節點間的距離計算
Table 主要用來管理與本節點與其他節點的連接的建立更新刪除
bucket - 所有 peer 按與本節點的距離遠近放在不同的桶(bucket)中,詳見之後的 節點維護
refreshReq - 更新 Table 請求通道
Table 的主要事件循環,主要負責控制 refresh 和 revalidate 過程。
refresh.C - 定時(30s)啟動Peer刷新過程的定時器
refreshReq - 接收其他線程投遞到 Table 的 刷新Peer連接 的通知,當收到該通知時啟動更新,詳見之後的 更新鄰居關系
revalidate.C - 定時重新檢查以連接節點的有效性的定時器,詳見之後的 探活檢測
udp 負責節點間通信的底層消息控制,是 Table 運行的 Kademlia 協議的底層組件
conn - 底層監聽埠的連接
addpending - udp 用來接收 pending 的channel。使用場景為:當我們向其他節點發送數據包後(packet)後可能會期待收到它的回復,pending用來記錄一次這種還沒有到來的回復。舉個例子,當我們發送ping包時,總是期待對方回復pong包。這時就可以將構造一個pending結構,其中包含期待接收的pong包的信息以及對應的callback函數,將這個pengding投遞到udp的這個channel。 udp 在收到匹配的pong後,執行預設的callback。
gotreply - udp 用來接收其他節點回復的通道,配合上面的addpending,收到回復後,遍歷已有的pending鏈表,看是否有匹配的pending。
Table - 和 Server 中的ntab是同一個 Table
udp 的處理循環,負責控制消息的向上遞交和收發控制
udp 的底層接受數據包循環,負責接收其他節點的 packet
以太坊使用 Kademlia 分布式路由存儲協議來進行網路拓撲維護,了解該協議建議先閱讀 易懂分布式 。更權威的資料可以查看 wiki 。總的來說該協議:
源碼中由 Table 結構保存所有 bucket , bucket 結構如下
節點可以在 entries 和 replacements 互相轉化,一個 entries 節點如果 Validate 失敗,那麼它會被原本將一個原本在 replacements 數組的節點替換。
有效性檢測就是利用 ping 消息進行探活操作。 Table.loop() 啟動了一個定時器(0~10s),定期隨機選擇一個bucket,向其 entries 中末尾的節點發送 ping 消息,如果對方回應了 pong ,則探活成功。
Table.loop() 會定期(定時器超時)或不定期(收到refreshReq)地進行更新鄰居關系(發現新鄰居),兩者都調用 doRefresh() 方法,該方法對在網路上查找離自身和三個隨機節點最近的若干個節點。
Table 的 lookup() 方法用來實現節點查找目標節點,它的實現就是 Kademlia 協議,通過節點間的接力,一步一步接近目標。
當一個節點啟動後,它會首先向配置的靜態節點發起連接,發起連接的過程稱為 Dial ,源碼中通過創建 dialTask 跟蹤這個過程
dialTask表示一次向其他節點主動發起連接的任務
在 Server 啟動時,會調用 newDialState() 根據預配置的 StaticNodes 初始化一批 dialTask , 並在 Server.run() 方法中,啟動這些這些任務。
Dial 過程需要知道目標節點( dest )的IP地址,如果不知道的話,就要先使用 recolve() 解析出目標的IP地址,怎麼解析?就是先要用藉助 Kademlia 協議在網路中查找目標節點。
當得到目標節點的IP後,下一步便是建立連接,這是通過 dialTask.dial() 建立連接
連接建立的握手過程分為兩個階段,在在 SetupConn() 中實現
第一階段為 ECDH密鑰建立 :
第二階段為協議握手,互相交換支持的上層協議
如果兩次握手都通過,dialTask將向 Server 的 addpeer 通道發送 peer 的信息
B. 選擇以太坊客戶端
有很多以太坊客戶端供我們選擇。我們推薦在開發和部署時使用不同的客戶端。
我們推薦 Ganache ,它是一個運行在你個人電腦上的私有連客戶端。它是 truffle 套種中的一部分,
Ganache 將智能合約和交易放在前台並且中心化,從而簡化了dapp的開發。使用 Ganache 你可以
快速查看你們的應用是如何影響區塊鏈的,並且對賬戶,余額,智能合約創建以及燃料消費進行自省。
Ganache 運行在 http://127.0.0.1:7545 。默認會創建是個賬戶,重啟後賬戶依然不會變,
當然也可以手動隨機賬戶,你也可以用你自己的賬戶。
我們同樣也推薦使用 truffle develop ,它是 truffle 內置的開發鏈工具。不需要任何的額外安裝,
你要使用它只需要一條命令行即可:
Truffle Develop 運行在 http://127.0.0.1:9545 上。
當你的開發機沒有圖形界面時就無法直接使用 Ganache ,而 Ganache CLI 就提供了沒有圖形界面系統的能力。
有很多官方和非官網的以太坊客戶端你可以選擇。以下是部分:
C. 以太坊是什麼丨以太坊開發入門指南
以太坊是什麼丨以太坊開發入門指南
很多同學已經躍躍欲試投入到區塊鏈開發隊伍當中來,可是又感覺無從下手,本文將基於以太坊平台,以通俗的方式介紹以太坊開發中涉及的各晦澀的概念,輕松帶大家入門。
以太坊是什麼
以太坊(Ethereum)是一個建立在區塊鏈技術之上, 去中心化應用平台。它允許任何人在平台中建立和使用通過區塊鏈技術運行的去中心化應用。
對這句話不理解的同學,姑且可以理解為以太坊是區塊鏈里的Android,它是一個開發平台,讓我們就可以像基於Android Framework一樣基於區塊鏈技術寫應用。
在沒有以太坊之前,寫區塊鏈應用是這樣的:拷貝一份比特幣代碼,然後去改底層代碼如加密演算法,共識機制,網路協議等等(很多山寨幣就是這樣,改改就出來一個新幣)。
以太坊平台對底層區塊鏈技術進行了封裝,讓區塊鏈應用開發者可以直接基於以太坊平台進行開發,開發者只要專注於應用本身的開發,從而大大降低了難度。
目前圍繞以太坊已經形成了一個較為完善的開發生態圈:有社區的支持,有很多開發框架、工具可以選擇。
智能合約
什麼是智能合約
以太坊上的程序稱之為智能合約, 它是代碼和數據(狀態)的集合。
智能合約可以理解為在區塊鏈上可以自動執行的(由事件驅動的)、以代碼形式編寫的合同(特殊的交易)。
在比特幣腳本中,我們講到過比特幣的交易是可以編程的,但是比特幣腳本有很多的限制,能夠編寫的程序也有限,而以太坊則更加完備(在計算機科學術語中,稱它為是「圖靈完備的」),讓我們就像使用任何高級語言一樣來編寫幾乎可以做任何事情的程序(智能合約)。
智能合約非常適合對信任、安全和持久性要求較高的應用場景,比如:數字貨幣、數字資產、投票、保險、金融應用、預測市場、產權所有權管理、物聯網、點對點交易等等。
目前除數字貨幣之外,真正落地的應用還不多(就像移動平台剛開始出來一樣),相信1到3年內,各種殺手級會慢慢出現。
編程語言:Solidity
智能合約的默認的編程語言是Solidity,文件擴展名以.sol結尾。
Solidity是和JavaScript相似的語言,用它來開發合約並編譯成以太坊虛擬機位元組代碼。
還有長像Python的智能合約開發語言:Serpent,不過建議大家還是使用Solidity。
Browser-Solidity是一個瀏覽器的Solidity IDE, 大家可以點進去看看,以後我們更多文章介紹Solidity這個語言。
運行環境:EVM
EVM(Ethereum Virtual Machine)以太坊虛擬機是以太坊中智能合約的運行環境。
Solidity之於EVM,就像之於跟JVM的關系一樣,這樣大家就容易理解了。
以太坊虛擬機是一個隔離的環境,在EVM內部運行的代碼不能跟外部有聯系。
而EVM運行在以太坊節點上,當我們把合約部署到以太坊網路上之後,合約就可以在以太坊網路中運行了。
合約的編譯
以太坊虛擬機上運行的是合約的位元組碼形式,需要我們在部署之前先對合約進行編譯,可以選擇Browser-Solidity Web IDE或solc編譯器。
合約的部署
在以太坊上開發應用時,常常要使用到以太坊客戶端(錢包)。平時我們在開發中,一般不接觸到客戶端或錢包的概念,它是什麼呢?
以太坊客戶端(錢包)
以太坊客戶端,其實我們可以把它理解為一個開發者工具,它提供賬戶管理、挖礦、轉賬、智能合約的部署和執行等等功能。
EVM是由以太坊客戶端提供的。
Geth是典型的開發以太坊時使用的客戶端,基於Go語言開發。 Geth提供了一個互動式命令控制台,通過命令控制台中包含了以太坊的各種功能(API)。Geth的使用我們之後會有文章介紹,這里大家先有個概念。
Geth控制台和Chrome瀏覽器開發者工具里的面的控制台是類似,不過是跑在終端里。
相對於Geth,Mist則是圖形化操作界面的以太坊客戶端。
如何部署
智能合約的部署是指把合約位元組碼發布到區塊鏈上,並使用一個特定的地址來標示這個合約,這個地址稱為合約賬戶。
以太坊中有兩類賬戶:
· 外部賬戶
該類賬戶被私鑰控制(由人控制),沒有關聯任何代碼。
· 合約賬戶
該類賬戶被它們的合約代碼控制且有代碼與之關聯。
和比特幣使用UTXO的設計不一樣,以太坊使用更為簡單的賬戶概念。
兩類賬戶對於EVM來說是一樣的。
外部賬戶與合約賬戶的區別和關系是這樣的:一個外部賬戶可以通過創建和用自己的私鑰來對交易進行簽名,來發送消息給另一個外部賬戶或合約賬戶。
在兩個外部賬戶之間傳送消息是價值轉移的過程。但從外部賬戶到合約賬戶的消息會激活合約賬戶的代碼,允許它執行各種動作(比如轉移代幣,寫入內部存儲,挖出一個新代幣,執行一些運算,創建一個新的合約等等)。
只有當外部賬戶發出指令時,合同賬戶才會執行相應的操作。
合約部署就是將編譯好的合約位元組碼通過外部賬號發送交易的形式部署到以太坊區塊鏈上(由實際礦工出塊之後,才真正部署成功)。
運行
合約部署之後,當需要調用這個智能合約的方法時只需要向這個合約賬戶發送消息(交易)即可,通過消息觸發後智能合約的代碼就會在EVM中執行了。
Gas
和雲計算相似,佔用區塊鏈的資源(不管是簡單的轉賬交易,還是合約的部署和執行)同樣需要付出相應的費用(天下沒有免費的午餐對不對!)。
以太坊上用Gas機制來計費,Gas也可以認為是一個工作量單位,智能合約越復雜(計算步驟的數量和類型,佔用的內存等),用來完成運行就需要越多Gas。
任何特定的合約所需的運行合約的Gas數量是固定的,由合約的復雜度決定。
而Gas價格由運行合約的人在提交運行合約請求的時候規定,以確定他願意為這次交易願意付出的費用:Gas價格(用以太幣計價) * Gas數量。
Gas的目的是限制執行交易所需的工作量,同時為執行支付費用。當EVM執行交易時,Gas將按照特定規則被逐漸消耗,無論執行到什麼位置,一旦Gas被耗盡,將會觸發異常。當前調用幀所做的所有狀態修改都將被回滾, 如果執行結束還有Gas剩餘,這些Gas將被返還給發送賬戶。
如果沒有這個限制,就會有人寫出無法停止(如:死循環)的合約來阻塞網路。
因此實際上(把前面的內容串起來),我們需要一個有以太幣余額的外部賬戶,來發起一個交易(普通交易或部署、運行一個合約),運行時,礦工收取相應的工作量費用。
以太坊網路
有些著急的同學要問了,沒有以太幣,要怎麼進行智能合約的開發?可以選擇以下方式:
選擇以太坊官網測試網路Testnet
測試網路中,我們可以很容易獲得免費的以太幣,缺點是需要發很長時間初始化節點。
使用私有鏈
創建自己的以太幣私有測試網路,通常也稱為私有鏈,我們可以用它來作為一個測試環境來開發、調試和測試智能合約。
通過上面提到的Geth很容易就可以創建一個屬於自己的測試網路,以太幣想挖多少挖多少,也免去了同步正式網路的整個區塊鏈數據。
使用開發者網路(模式)
相比私有鏈,開發者網路(模式)下,會自動分配一個有大量余額的開發者賬戶給我們使用。
使用模擬環境
另一個創建測試網路的方法是使用testrpc,testrpc是在本地使用內存模擬的一個以太坊環境,對於開發調試來說,更方便快捷。而且testrpc可以在啟動時幫我們創建10個存有資金的測試賬戶。
進行合約開發時,可以在testrpc中測試通過後,再部署到Geth節點中去。
更新:testrpc 現在已經並入到Truffle 開發框架中,現在名字是Ganache CLI。
Dapp:去中心化的應用程序
以太坊社區把基於智能合約的應用稱為去中心化的應用程序(DecentralizedApp)。如果我們把區塊鏈理解為一個不可篡改的資料庫,智能合約理解為和資料庫打交道的程序,那就很容易理解Dapp了,一個Dapp不單單有智能合約,比如還需要有一個友好的用戶界面和其他的東西。
Truffle
Truffle是Dapp開發框架,他可以幫我們處理掉大量無關緊要的小事情,讓我們可以迅速開始寫代碼-編譯-部署-測試-打包DApp這個流程。
總結
我們現在來總結一下,以太坊是平台,它讓我們方便的使用區塊鏈技術開發去中心化的應用,在這個應用中,使用Solidity來編寫和區塊鏈交互的智能合約,合約編寫好後之後,我們需要用以太坊客戶端用一個有餘額的賬戶去部署及運行合約(使用Truffle框架可以更好的幫助我們做這些事情了)。為了開發方便,我們可以用Geth或testrpc來搭建一個測試網路。
註:本文中為了方便大家理解,對一些概念做了類比,有些嚴格來不是准確,不過我也認為對於初學者,也沒有必要把每一個概念掌握的很細致和准確,學習是一個逐步深入的過程,很多時候我們會發現,過一段後,我們會對同一個東西有不一樣的理解。
D. 浠ュお鍧婃妧鏈緋誨垪-浠ュお鍧婂叡璇嗘満鍒
涓銆佷互澶鍧婃妧鏈緋誨垪-浠ュお鍧婂叡璇嗘満鍒
鍖哄潡閾劇殑鐗圭偣涔嬩竴鏄鍘諱腑蹇冨寲銆備篃灝辨槸鑺傜偣浼氬垎甯冨湪鍚勪釜鍦版柟緇勬垚鍒嗗竷寮忕郴緇熴傚悇涓鑺傜偣闇瑕佸1涓闂棰樿揪鎴愪竴鑷達紝鐞嗘兂鎯呭喌涓嬶紝鍙闇瑕佸悓姝ョ姸鎬佸嵆鍙銆
濡備笂鍥炬墍紺 B鑺傜偣灝哸=1=> a=2鐨勭姸鎬佸悓姝ョ粰? ACDE鍥涗釜鑺傜偣錛岃繖鏃剁郴緇熶腑鐘舵佸彉涓篴=2, 浣嗗傛灉鍏朵腑鏈夋伓鎰忚妭鐐 AE 鏀跺埌閫氱煡鍚庢妸a=1=>a=3淇鏀逛負閿欒鐨勮妭鐐癸紝榪欎釜鏃跺欏ぇ瀹剁殑鐘舵佸氨涓嶄竴鑷翠簡錛屾ゆ椂闇瑕佸叡璇嗘満鍒朵嬌緋葷粺涓寰楀埌1涓鍞涓姝g『鐨勭姸鎬併
濡備笂闈㈣村埌鍒嗗竷寮忕郴緇熷瓨鍦ㄦ伓鎰忚妭鐐瑰艱嚧緋葷粺涓鐘舵佷笉涓鑷寸殑鎯呭喌鏈1涓姣旇緝钁楀悕鐨勮櫄鎷熼棶棰-鎷滃崰搴灝嗗啗闂棰樸
鎷滃崰搴灝嗗啗闂棰樻槸鎸囷紝N涓灝嗗啗鍘繪敾鎵撲竴搴у煄鍫★紝濡傛灉澶т簬涓瀹氭暟閲忕殑灝嗗啗鍚屾椂榪涙敾鍒欏彲浠ユ敾鎵撴垚鍔燂紝濡傛灉灝忎簬鍒欒繘鏀誨け璐ャ傚皢鍐涗腑鍙鑳藉瓨鍦ㄥ彌寰掋
榪欎釜鏃跺欐湁2縐嶆儏鍐
1.濡傛灉2涓鍙涘緬閮藉湪BCDE涓錛岄偅涔堝叡璇嗙畻娉曢渶瑕佽╁叾浣2涓灝嗗啗鍚浠嶢鐨勬g『鍐崇瓥榪涙敾鍩庡牎銆
2.濡傛灉A鏄1涓鍙涘緬錛屽叡璇嗙畻娉曢渶瑕佽〣CDE涓鍓╀綑鐨3涓蹇犺瘹灝嗗啗淇濇寔涓鑷淬
榪欎釜闂棰樻湁寰堝氱嶈В娉曪紝澶у舵湁鍏磋叮鍙浠ヨ嚜琛屾煡闃(鎺ㄨ崘瀛︿範PBFT)錛屾垜浠閲嶇偣鏉ョ湅鐪嬩互澶鍧婁腑鐩鍓嶆e湪浣跨敤鐨凬akamoto?鍏辮瘑鍜屽皢瑕佷嬌鐢ㄧ殑?Casper Friendly Finality Gadget鍏辮瘑鏄濡備綍瑙e喅鎷滃崰搴灝嗗啗闂棰樼殑銆
璇村埌Nakamoto鍏辮瘑鍜孋asper Friendly Finality Gadget鍏辮瘑鍙鑳藉ぇ瀹朵笉澶鐔熸倝錛屼絾浠栦滑鐨勯儴鍒嗙粍鎴愬簲璇ラ兘姣旇緝鐔熸倝-POW(宸ヤ綔閲忚瘉鏄)鍜孭OS(鏉冪泭璇佹槑)銆
POW鎴朠OS縐頒箣涓篠ybil鎶楁ф満鍒訛紝涓轟粈涔堥渶瑕丼ybil鎶楁ф満鍒跺憿錛屽垰鍒氭垜浠璇村埌鎷滃崰搴灝嗗啗闂棰橈紝搴旇ュ緢瀹規槗鐪嬪嚭鎮舵剰鑺傜偣瓚婂氾紝杈炬垚姝g『鍏辮瘑鐨勯毦搴︿篃灝辮秺澶э紝Sybil鏀誨嚮灝辨槸鎸1涓鏀誨嚮鑰呭彲浠ヤ吉瑁呭嚭澶ч噺鑺傜偣鏉ヨ繘琛屾敾鍑伙紝Sybil鎶楁ф槸鎸囨姷寰¤繖縐嶆敾鍑昏兘鍔涖
POW閫氳繃璁╃熆宸ユ垨楠岃瘉鑰呮姇鍏ョ畻鍔涳紝POS閫氳繃璁╅獙璇佽呰川鎶間互澶鍧婏紝濡傛灉鏀誨嚮鑰呰佷吉瑁呭氫釜鑺傜偣鏀誨嚮鍒欏繀灝嗘姇鍏ュぇ閲忕殑綆楀姏鎴栬祫浜э紝浼氬艱嚧鏀誨嚮鎴愭湰楂樹簬鏀剁泭銆傚湪浠ュお鍧婁腑淇濋殰鐨勫畨鍏ㄦф槸闄ら潪鏀誨嚮鑰呮嬁鍒版暣涓緋葷粺51%綆楀姏鎴栬祫浜у惁鍒欎笉鍙鑳借繘鏀繪垚鍔熴
鍦ㄨВ鍐沖畬Sybil鏀誨嚮鍚庯紝閫氳繃閫夊彇緋葷粺涓鐨勬渶闀塊摼浣滀負澶у惰揪鎴愬叡璇嗙殑閾俱
寰堝氫漢騫蟲椂涓轟簡綆鍖栧皢pow鍜宲os璁や負鏄鍏辮瘑鏈哄埗錛岃繖涓嶅熷噯紜錛屼絾涔熻存槑浜嗗叾閲嶈佷綔鐢錛屾垜浠鎺ヤ笅鏉ュ垎鏋恜ow鍜宲os銆
閫氳繃hash涓嶅彲閫嗙殑鐗規э紝瑕佹眰鍚勪釜鐭垮伐涓嶅仠鍦拌$畻鍑烘煇涓鍊肩殑hash絎﹀悎鏌愪竴鐗瑰緛錛屾瘮濡傚墠澶氬皯浣嶆槸000000錛岀敱浜庤繖涓榪囩▼鍙鑳戒緷璧栦笉鍋滅殑璇曢敊璁$畻hash,鎵浠ユ槸宸ヤ綔閲忚瘉鏄庛傝$畻瀹屾垚鍚庡叾浠栬妭鐐歸獙璇佺殑鍊肩﹀悎hash鐗瑰緛闈炲父瀹規槗楠岃瘉銆傞獙璇侀氳繃鍒欐垚涓烘垚涓哄悎娉曞尯鍧(涓嶄竴瀹氭槸鍏辮瘑鍖哄潡錛岄渶瑕佸湪鏈闀塊摼涓)銆
浠ュお鍧婁腑鐨勬寲鐭跨畻娉曠敤鍒2涓鏁版嵁闆嗭紝1涓灝忔暟鎹闆哻ache,1涓澶ф暟鎹闆咲AG銆傝繖2涓鏁版嵁闅忕潃鍖哄潡閾句腑鍖哄潡澧炲氭參鎱㈠彉澶э紝鍒濆嬪ぇ灝廲ache涓16M DAG涓1G銆
鎴戜滑鍏堟潵鐪嬭繖2涓鏁版嵁闆嗙殑鐢熸垚榪囩▼
cache鐢熸垚瑙勫垯涓烘湁1涓縐嶅瓙闅忔満鏁皊eed錛宑ache涓絎1涓鍏冪礌瀵箂eed鍙杊ash錛屽悗闈㈡暟緇勪腑姣忎釜鍏冪礌閮芥槸鍓1涓鍏冪礌鍙杊ash鑾峰緱銆
DAG鐢熸垚瑙勫垯涓?鎵懼埌cache涓瀵瑰簲鐨勫厓緔犲悗?鏍規嵁鍏冪礌涓鐨勫艱$畻鍑轟笅嬈¤佸繪壘鐨勪笅鏍囷紝寰鐜256嬈″悗鑾峰緱cache涓鏈緇堥渶瑕佺殑鍏冪礌鍊艱繘琛宧ash璁$畻寰楀埌DAG涓鍏冪礌鐨勫箋
鐒跺悗鎴戜滑鍐嶇湅鐪嬬熆宸ュ備綍榪涜屾寲鐭誇互鍙婅交鑺傜偣濡備綍楠岃瘉
鐭垮伐鎸栫熆鐨勮繃紼嬩負錛岄夋嫨Nonce鍊兼槧灝勫埌DAG涓鐨1涓猧tem錛岄氳繃item涓鐨勫艱$畻鍑轟笅嬈¤佹壘鐨勪笅鏍囷紝寰鐜64嬈★紝寰楀埌鏈緇坕tem錛屽皢item涓鐨勫糷ash璁$畻寰楀埌緇撴灉錛岀粨鏋滃拰target姣旇緝錛岀﹀悎鏉′歡
鍒欒瘉鏄庢寲鍒板尯鍧楋紝濡傛灉涓嶇﹀悎鍒欐洿鎹nonce緇х畫鎸栫熆銆傜熆宸ュ湪鎸栫熆榪囩▼涓闇瑕佸皢1G鐨凞AG璇誨彇鍒板唴瀛樹腑銆
杞昏妭鐐歸獙璇佽繃紼嬪拰鐭垮伐鎸栫熆榪囩▼鍩烘湰涓鑷達紝
灝嗗潡澶撮噷闈㈢殑Nonce鍊兼槧灝勫埌DAG涓鐨1涓猧tem錛岀劧鍚庨氳繃cache鏁扮粍璁$畻鍑鴻item鐨勫礆紝閫氳繃item涓鐨勫艱$畻鍑轟笅嬈¤佹壘鐨勪笅鏍囷紝寰鐜64嬈★紝寰楀埌鏈緇坕tem錛屽皢item涓鐨勫糷ash璁$畻寰楀埌緇撴灉錛岀粨鏋滃拰target姣旇緝錛岀﹀悎鏉′歡鍒欓獙璇侀氳繃銆傝交鑺傜偣鍦ㄩ獙璇佽繃紼嬩腑涓嶉渶瑕佸皢1G鐨凞AG璇誨彇鍒板唴瀛樹腑銆傛瘡嬈$敤鍒癉AG鐨剗tem鍊奸兘浣跨敤cache榪涜岃$畻銆
浠ュお鍧婁負浠涔堥渶瑕佽繖2涓涓嶅悓澶у皬鐨勬暟緇勮繘琛岃緟鍔﹉ash榪愮畻鍛錛岀洿鎺ヨ繘琛宧ash榪愮畻浼氭湁浠涔堥棶棰橈紵
濡傛灉鍙鏄榪涜岄噸澶嶈$畻浼氬艱嚧鎸栫熆璁懼囦笓涓氬寲錛屽噺灝戝幓涓蹇冨寲紼嬪害銆傚洜涓烘垜浠鏃ュ父浣跨敤鐨勮$畻鏈哄唴瀛樺拰璁$畻鍔涙槸閮介渶瑕佺殑錛屽傛灉鎸栫熆鍙闇瑕乭ash榪愮畻錛屾寲鐭胯懼囧垯浼氳捐″湴鎷ユ湁瓚呴珮綆楀姏錛屼絾瀵瑰唴瀛樺彲浠ョ緝灝忓埌寰堝皬鐢氳嚦娌℃湁銆傛墍浠ユ垜浠閫夌敤1G鐨勫ぇ鍐呭瓨澧炲姞瀵瑰唴瀛樿塊棶鐨勯戠巼錛屽炲姞鎸栫熆璁懼囧瑰唴瀛樿塊棶闇奼傦紝浠庤屾洿鎺ヨ繎浜庢垜浠鏃ュ父浣跨敤鐨勮$畻鏈恆
鎴戜滑鐪嬬湅鍦∟akamoto鍏辮瘑鏄濡備綍瑙e喅鎷滃崰搴灝嗗啗闂棰樼殑銆傞栧厛鐪嬬湅鍖哄潡閾句腑鐨勬嫓鍗犲涵灝嗗啗闂棰樻槸浠涔堬紵
鍖哄潡閾句腑闇瑕佽揪鎴愪竴鑷寸殑鏄鍝鏉¢摼涓轟富閾撅紝鉶界劧閲囩敤浜嗘渶闀塊摼鍘熷垯錛屼絾鐢變簬鍒嗗弶闂棰橈紝榪樻槸浼氬甫鏉ユ嫓鍗犲涵灝嗗啗闂棰樸
鏈鏉ヤ互澶鍧妏ow鐩鏍囨槸鎶墊姉51%浠ヤ笅鐨勬敾鍑伙紝浣嗗備笂鍥懼傛灉鎮舵剰鑺傜偣娌跨潃鑷宸辨寲鍑虹殑鍖哄潡涓嶆柇鎸栫熆錛岀敱浜庝富閾句笂鏈夊垎鍙夊瓨鍦錛屾伓鎰忚妭鐐逛笉闇瑕佽揪鍒51%綆楀姏灝卞彲浠ヨ秴榪囦富閾捐繘鑰屾垚涓烘柊鐨勪富閾撅紝涓烘や互澶鍧婁嬌鐢ㄤ簡ghost鍗忚緇欎笂鍥句腑鐨凚1鍜孋1涔熷垎閰嶅嚭鍧楀栧姳錛屽敖蹇鍚堝苟鍒頒富閾句腑錛岃繖鏍蜂富閾鵑暱搴(鎸夌収鍚堝苟鍚庣殑鎬婚暱搴︾畻錛岄暱搴﹀彧鏄鎶借薄姒傚康錛屼互澶鍧婁腑鎸夌収鍖哄潡鏉冮噸緔鍔)榪樻槸澶т簬鎮舵剰鑺傜偣鑷宸辨寲鐭跨殑銆
緗戠粶涓鐨勭敤鎴烽氳繃璐ㄦ娂涓瀹氭暟閲忕殑浠ュお鍧婃垚涓洪獙璇佽呫傛瘡嬈$郴緇熶粠榪欎簺楠岃瘉鑰呬粠闅忔満閫夋嫨鍑哄尯鍧楀壋寤鴻咃紝鍏朵綑楠岃瘉鑰呭幓楠岃瘉鍒涘緩鍑虹殑鍖哄潡鏄鍚﹀悎娉曘傞獙璇佽呬細鑾峰緱鍑哄潡濂栧姳錛屾病鏈夎閫変腑鐨勫尯鍧椾笉榪涜岄獙璇佸垯浼氳鎵i櫎涓瀹氳川鎶煎竵錛屽傛灉榪涜岄敊璇楠岃瘉鍒欎細琚鎵i櫎鍏ㄩ儴璐ㄦ娂甯併
濡備笂鍥撅紝鏉冪泭璇佹槑鍦ㄦ瘡闅斾竴瀹氬尯鍧楃殑鍦版柟璁劇疆涓涓媯鏌ョ偣錛屽瑰墠闈㈢殑鍖哄潡榪涜岄獙璇侊紝2/3楠岃瘉鑰呴氳繃鍒欓獙璇侀氳繃錛岄獙璇侀氳繃鍒欒ュ尯鍧楁墍鍦ㄩ摼鎴愪負鏈闀垮悎娉曢摼(涓嶈兘琚鍥炴粴)銆
鎴戜滑綆鍖栧湴鍙鍒嗘瀽浜嗘潈鐩婅瘉鏄庢湰韜錛屽湪浠ュお鍧婁腑鏉冪泭璇佹槑杈冧負澶嶆潅鐨勭偣鍦ㄤ簬鍜屽垎鐗囨満鍒剁粨鍚堝湪涓璧鋒椂鐨勮繍琛屾祦紼嬶紝榪欓儴鍒嗕細鍦ㄥ悗闈㈠崟鐙灝嗗垎鐗囨満鍒剁殑涓綃囨枃絝犱腑璇﹁堪銆
鏈綃囨枃絝犱富瑕佽ㄨ轟簡鍏辮瘑鏈哄埗鏄瑙e喅鍒嗗竷寮忕郴緇熶腑鐨勬嫓鍗犲涵灝嗗啗闂棰橈紝浠ュ強鍒嗘瀽浜嗕互澶鍧婁腑鐨勫叡璇嗘満鍒朵竴鑸鍖呮嫭鏈闀塊摼閫夋嫨鍜屼竴縐峴ybil鎶楁ф満鍒(pow鎴杙os)銆傞噸鐐瑰垎鏋愪簡pow鍜宲os鐨勬祦紼嬩互鍙婅捐℃濇兂銆傚悗緇灝嗗紑濮嬮噸鐐硅ㄨ烘櫤鑳藉悎綰︾殑閮ㄥ垎銆
浜屻佷粈涔堟槸浠ュお鍧婄殑鍏辮瘑鏈哄埗錛
鍖哄潡閾炬妧鏈鐨勬牳蹇冧紭鍔誇箣涓錛屽氨鏄鑳藉熷湪鍐崇瓥鏉冮珮搴﹀垎鏁g殑鍘諱腑蹇冨寲緋葷粺涓錛屼嬌寰楀悇鑺傜偣楂樻晥鍦伴拡瀵瑰尯鍧楁暟鎹鐨勬湁鏁堟у拰涓鑷存ц揪鎴愬叡璇嗐傜敱浜庣偣瀵圭偣緗戠粶涓嬪瓨鍦ㄨ緝楂樼殑緗戠粶寤惰繜錛屽悇涓鑺傜偣鎵瑙傚療鍒扮殑浜嬪姟鍏堝悗欏哄簭涓嶅彲鑳藉畬鍏ㄤ竴鑷淬傚洜姝ゅ尯鍧楅摼緋葷粺闇瑕佽捐′竴縐嶆満鍒訛紝瀵瑰湪宸涓嶅氭椂闂村唴鍙戠敓鐨勪簨鍔$殑鍏堝悗欏哄簭榪涜屽叡璇嗭紝榪欑嶅逛竴涓鏃墮棿紿楀彛鍐呯殑浜嬪姟鐨勫厛鍚庨『搴忚揪鎴愬叡璇嗙殑綆楁硶琚縐頒負鈥滃叡璇嗘満鍒垛濆叡璇嗘満鍒惰鐢ㄦ潵鍐沖畾鍖哄潡閾劇綉緇滀腑鐨勮拌處鑺傜偣錛屽苟瀵逛氦鏄撲俊鎮榪涜岀『璁ゅ拰涓鑷存у悓姝ャ備互澶鍧婂叡璇嗘満鍒跺叡鏈夊洓涓闃舵碉紝鍗矲rontier錛堝墠娌匡級銆丠omestead錛堝跺洯錛夈丮etropolis錛堝ぇ閮戒細錛夈丼erenity錛堝畞闈欙級銆備互澶鍧婂墠涓変釜闃舵甸噰鐢ㄧ殑鏄疨OW鍏辮瘑鏈恆傜鍥涗釜闃舵靛皢閲囩敤鑷宸卞壋寤虹殑POS鏈哄埗錛屽悕涓篊asper鎶曟敞鍏辮瘑錛岃繖縐嶆満鍒跺炲姞浜嗘儵緗氭満鍒訛紝騫跺熀浜嶱OS鐨勬濇兂鍦ㄨ拌處鑺傜偣涓閫夊彇楠岃瘉浜恆侾OW鍗沖伐浣滈噺璇佹槑錛屾槸姣旂壒甯佺郴緇熶腑閲囩敤鐨勫叡璇嗘満鍒躲傦紙鏈鏂囦富瑕佽茶В浠ュお鍧婄殑鍏辮瘑鏈哄埗錛夎皥璧稢asper鎶曟敞鍏辮瘑錛岃佸厛璇碢OS銆侾OS鍗蟲潈鐩婅瘉鏄庯紝涓昏佺壒鐐逛互鏉冪泭璇佹槑浠f浛宸ヤ綔閲忚瘉鏄庯紝鐢卞叿鏈夋渶楂樻潈鐩婄殑鑺傜偣瀹炵幇鏂板潡鍔犲叆鍜岃幏寰楁縺鍔辨敹鐩娿侾OS鍏辮瘑鏄涓鴻В鍐砅OW鍏辮瘑鏈哄埗鐨勮祫婧愭氮璐瑰拰瀹夊叏鎬х己闄瘋屾彁鍑虹殑鏇誇唬鏂規堛傚畠鐨勬湰璐ㄦ槸閲囩敤鏉冪泭璇佹槑鏉ヤ唬鏇縋OW涓鐨勫熀浜庡搱甯岀畻鍔涚殑宸ヤ綔閲忚瘉鏄庯紝鏄鐢辯郴緇熶腑鍏鋒湁鏈楂樻潈鐩婅岄潪鏈楂樼畻鍔涚殑鑺傜偣鑾峰緱鍖哄潡璁拌處鏉冦傛潈鐩婁綋鐜頒負鑺傜偣瀵圭壒瀹氭暟閲忚揣甯佺殑鎵鏈夋潈錛岀О涓哄竵榫勬垨甯佸ぉ鏁幫紙Coindays錛夈傚竵榫勬槸鐗瑰畾鏁伴噺鐨勫竵涓庡叾鏈鍚庝竴嬈′氦鏄撶殑鏃墮棿闀垮害鐨勪箻縐錛屾瘡嬈′氦鏄撻兘灝嗕細娑堣楁帀鐗瑰畾鏁伴噺鐨勫竵榫勩備緥濡傛煇浜哄湪涓絎斾氦鏄撲腑鏀跺埌10涓甯佸悗騫舵寔鏈10澶╋紝鍒欒幏寰100甯侀緞錛涜屽悗鍏惰姳鎺5涓甯佸悗鍒欐秷鑰楁帀50甯侀緞錛屾樉鐒墮噰鐢≒OS鍏辮瘑鏈哄埗鐨勭郴緇熷湪鐗瑰畾鏃墮棿鐐逛笂鐨勫竵榫勬繪暟鏄鏈夐檺鐨勶紝闀挎湡鎸佸竵鑰呮洿鍊懼悜浜庢嫢鏈夋洿澶氬竵榫勶紝鍥犳ゅ竵榫勫彲瑙嗕負鍏跺湪POS緋葷粺涓鐨勬潈鐩娿傛姇娉ㄥ叡璇嗘槸浠ュお鍧婁笅涓浠g殑鍏辮瘑鏈哄埗Casper錛堥奸┈灝忕簿鐏碉級寮曞叆鐨勪竴涓鍏ㄦ柊姒傚康錛屽睘浜嶱OS銆侰asper鐨勫叡璇嗘槸鎸夊尯鍧楄揪鎴愮殑錛岃屼笉鍍廝OS閭f牱鎸夐摼杈炬垚銆備負浜嗛槻姝㈤獙璇佷漢鍦ㄤ笉鍚岀殑涓栫晫涓鎻愪緵涓嶅悓鐨勬姇娉錛岃繕鏈変竴涓綆鍗曚弗鏍肩殑鏉℃撅細濡傛灉浣犱袱嬈$殑鎶曟敞搴忓彿涓鏍鳳紝鎴栬呰翠綘鎻愪氦浜嗕竴涓鏃犳硶璁〤asper渚濈収鍚堢害澶勭悊鐨勬姇娉錛屼綘灝嗗け鍘繪墍鏈変繚璇侀噾銆備粠榪欎竴鐐瑰彲浠ョ湅鍑猴紝Casper涓庝紶緇熺殑POS涓嶅悓鐨勬槸錛孋asper鏈夋儵緗氭満鍒訛紝榪欐牱闈炴硶鑺傜偣閫氳繃鎮舵剰鏀誨嚮緗戠粶涓嶄粎寰椾笉鍒頒氦鏄撹垂錛岃屼笖榪橀潰涓寸潃淇濊瘉閲戣娌℃敹鐨勯庨櫓銆侰asper鍗忚涓嬬殑楠岃瘉浜洪渶瑕佸畬鎴愬嚭鍧楀拰鎶曟敞涓や釜媧誨姩銆傚叿浣撳備笅錛氬嚭鍧楁槸涓涓鐙絝嬩簬鍏朵粬鎵鏈夋椂闂磋屽彂鐢熺殑榪囩▼錛岄獙璇佷漢鏀墮泦浜ゆ槗錛屽綋杞鍒頒粬浠鐨勫嚭鍧楁椂闂存椂錛屼粬浠灝卞埗閫犱竴涓鍖哄潡錛屽苟絳懼悕錛岀劧鍚庡彂閫佸埌緗戠粶涓娿傛姇娉ㄧ殑榪囩▼鏇翠負澶嶆潅涓浜涳紝鐩鍓岰asper榛樿ょ殑楠岃瘉浜虹瓥鐣ヨ璁捐′負妯′豢浼犵粺鐨勬嫓鍗犲涵瀹歸敊鍏辮瘑錛氳傚療鍏朵粬鐨勯獙璇佷漢濡備綍鎶曟敞錛屽彇33%澶勭殑鍊礆紝鍚0鎴1榪涗竴姝ョЩ鍔ㄣ傝屽㈡埛絝紜璁ゅ綋鍓嶇姸鎬佺殑榪囩▼鏄榪欐牱鐨勶細涓寮濮嬪厛涓嬭澆鎵鏈夌殑鍖哄潡鍜屾姇娉錛岀劧鍚庣敤涓婇潰鐨勭畻娉曟潵褰㈡垚鑷宸辯殑鎰忚侊紝浣嗘槸涓嶅叕甯冩剰瑙侊紱瀹冨彧鏄綆鍗曞湴鎸夐『搴忓湪姣忎釜楂樺害榪涜岃傚療錛屽傛灉涓涓鍖哄潡鐨勬傜巼楂樹簬0.5灝卞勭悊瀹冿紝鍚﹀垯灝辮煩榪囧畠銆傚湪澶勭悊鎵鏈夌殑鍖哄潡涔嬪悗錛屾墍寰楀埌鐨勭姸鎬佸氨鍙浠ユ樉紺轟負鍖哄潡閾劇殑鈥滃綋鍓嶇姸鎬佲濄傚㈡埛絝榪樺彲浠ョ粰鍑哄逛簬鈥滄渶緇堢『瀹氣濈殑涓昏傜湅娉曪細濡傛灉楂樺害k涔嬪墠鐨勬瘡涓鍖哄潡褰㈡垚鐨勬剰瑙侀珮浜99.999%鎴栬呬綆浜0.001%錛岄偅涔堝㈡埛絝鍙浠ヨや負鍓峩涓鍖哄潡宸茬粡鏈緇堢『瀹氥
涓夈佷粈涔堟槸浠ュお鍧?
閲嶅嶉棶棰樿佺櫨搴︾煡閬撶殑涓涓鍥炵瓟錛岀櫨搴︾煡閬撶瓟妗
E. 以太坊stratum協議原理
參照比特幣的 stratum協議 和 NiceHash的stratum協議規范 編寫了一版以太坊版本的stratum協議說明.
stratum協議是目前最常用的礦機和礦池之間的TCP通訊協議。
以太坊是一個去中心化的網路架構,通過安裝Mist客戶端的節點來轉發新交易和新區塊。而礦機、礦池也同時形成了另一個網路,我們稱之為礦工網路。
礦工網路分成礦機、礦池、錢包等幾個主要部分,有時礦池軟體與錢包安裝在一起,可合稱為礦池。
礦機與礦池軟體之間的通訊協議是 stratum ,而礦池軟體與錢包之間的通訊是 bitcoinrpc 介面。
stratum是 JSON 為數據格式.
礦機啟動,首先以 mining.subscribe 方法向礦池連接,用來訂閱工作。
礦池以 mining.notify 返回訂閱號、ExtraNonce1和ExtraNonce2_size。
Client:
Server:
其中:
是 訂閱號 ;
080c是 extranonce ,Extranonce可能最大3位元組;
礦機以 mining.authorize 方法,用某個帳號和密碼登錄到礦池,密碼可空,礦池返回 true 登錄成功。該方法必須是在初始化連接之後馬上進行,否則礦機得不到礦池任務。
Client:
Server:
難度調整由礦池下發給礦機,以 mining.set_difficulty 方法調整難度, params 中是難度值。
Server:
礦機會在下一個任務時採用新難度,礦池有時會馬上下發一個新任務並且把清理任務設為true,以便礦機馬上以新難度工作。
該命令由礦池定期發給礦機,當礦機以 mining.subscribe 方法登記後,礦池應該馬上以 mining.notify 返回該任務。
Server:
任務ID : bf0488aa ;
seedhash : 。每一個任務都發送一個seedhash來支持盡可能多的礦池,這可能會很快地在貨幣之間交換。
headerhash : 。
boolean cleanjobs : true 。如果設為true,那麼礦工需要清理任務隊列,並立即開始從事新提供的任務,因為所有舊的任務分享都將導致陳舊的分享錯誤。如果是 false 則等當前任務結束才開始新任務。
礦工使用seedhash識別DAG,然後帶著headerhash,extranonce和自己的minernonce尋找低於目標的share(這是由提供的難度而產生的)。
礦機找到合法share時,就以」 mining.submit 「方法向礦池提交任務。礦池返回true即提交成功,如果失敗則error中有具體原因。
Client:
任務ID : bf0488aa
minernonce : 6a909d9bbc0f 。注意minernonce是6個位元組,因為提供的extranonce是2個位元組。如果礦池提供3位元組的extranonce,那麼minernonce必須是5位元組
Server:
一般的礦機與礦池通訊過程就如下所示:
F. 在windows下怎麼啟動Truffle
Truffle是一個世界級的開發環境,測試框架,以太坊的資源管理通道,致力於讓以太坊上的開發變得簡單,Truffle有以下:
內置的智能合約編譯,鏈接,部署和二進制文件的管理。
快速開發下的自動合約測試。
腳本化的,可擴展的部署與發布框架。
部署到不管多少的公網或私網的網路環境管理功能
使用EthPM&NPM提供的包管理,使用ERC190標准。
與合約直接通信的直接交互控制台(寫完合約就可以命令行里驗證了)。
可配的構建流程,支持緊密集成。
在Truffle環境里支持執行外部的腳本。
Truffle是最流行的開發框架,使命是讓開發更容易
安裝方式:
$ npm install -g truffle
環境要求
NodeJS 5.0+
Windows,Linux,或Mac OS X
Truffle需要以太坊客戶端,需要支持標準的JSON RPC API。對於開發來說,有一些更適合,後續章節會介紹(如:testRPC提供編碼調試時的實時反饋)。
Windows用戶的建議
如果你是Windows用戶,我們推薦你使用Powershell或Git BASH來安裝和使用Truffle框架。這兩個shell環境相對默認的,提供了更方便的一些特性。
如果你必須使用命令行,可以看這里的關於如何配置Truffle的討論。
G. 以太坊區塊鏈之Bug --2020/05/19
為了防止交易重播,ETH(ETC)節點要求每筆交易必須有一個nonce數值。每一個賬戶從同一個節點發起交易時,這個nonce值從0開始計數,發送一筆nonce對應加1。當前面的nonce處理完成之後才會處理後面的nonce。注意這里的前提條件是相同的地址在相同的節點發送交易。
以下是nonce使用的幾條規則:
● 當nonce太小(小於之前已經有交易使用的nonce值),交易會被直接拒絕。
● 當nonce太大,交易會一直處於隊列之中,這也就是導致我們上面描述的問題的原因;
● 當發送一個比較大的nonce值,然後補齊開始nonce到那個值之間的nonce,那麼交易依舊可以被執行。
● 當交易處於queue中時停止geth客戶端,那麼交易queue中的交易會被清除掉。
第一個欄位 AccountNonce ,直譯就是賬戶隨機數。它是以太坊中很小但也很重要的一個細節。以太坊為每個賬戶和交易都創建了一個Nonce,當從賬戶發起交易的時候,當前賬戶的Nonce值就被作為交易的Nonce。這里,如果是普通賬戶那麼Nonce就是它發出的交易數,如果是合約賬戶就是從它的創建合約數。
為什麼要使用這個Nonce呢?其主要目的就是為了防止重復攻擊(Replay Attack)。因為交易都是需要簽名的,假定沒有Nonce,那麼只要交易數據和發起人是確定的,簽名就一定是相同的,這樣攻擊者就能在收到一個交易數據後,重新生成一個完全相同的交易並再次提交,比如A給B發了個交易,因為交易是有簽名的,B雖然不能改動這個交易數據,但只要反復提交一模一樣的交易數據,就能把A賬戶的所有資金都轉到B手裡。
當使用賬戶Nonce之後,每次發起一個交易,A賬戶的Nonce值就會增加,當B重新提交時,因為Nonce對不上了,交易就會被拒絕。這樣就可以防止重復攻擊。當然,事情還沒有完,因為還能跨鏈實施攻擊,直到EIP-155引入了chainID,才實現了不同鏈之間的交易數據不兼容。事實上,Nonce並不能真正防止重復攻擊,比如A向B買東西,發起交易T1給B,緊接著又提交另一個交易T2,T2的Gas價格更高、優先順序更高將被優先處理,如果恰好T2處理完成後剩餘資金已經不足以支付T1,那麼T1就會被拒絕。這時如果B已經把東西給了A,那A也就攻擊成功了。所以說,就算交易被處理了也還要再等待一定時間,確保生成足夠深度的區塊,才能保證交易的不可逆。
Price 指的是單位Gas的價格,所謂Gas就是交易的消耗,Price就是單位Gas要消耗多少以太幣(Ether),Gas * Price就是處理交易需要消耗多少以太幣,它就相當於比特幣中的交易手續費。
GasLimit 限定了本次交易允許消耗資源的最高上限,換句話說,以太坊中的交易不可能無限制地消耗資源,這也是以太坊的安全策略之一,防止攻擊者惡意佔用資源。
Recipient 是交易接收者,它是common.Address指針類型,代表一個地址。這個值也可以是空的,這時在交易執行時,會通過智能合約創建一個地址來完成交易。
Amount 是交易額。這個簡單,不用解釋。
Payload 比較重要,它是一個位元組數組,可以用來作為創建合約的指令數組,這時每個位元組都是一個單獨的指令;也可以作為數據數組,由合約指令來進行操作。合約由以太坊虛擬機(Ethereum Virtual Machine,EVM)創建並執行。
V、R、S 是交易的簽名數據。以太坊當中,交易經過數字簽名之後,生成的signature是一個長度65的位元組數組,它被截成三段,前32位元組被放進R,再32位元組放進S,最後1個位元組放進V。那麼為什麼要被截成3段呢?以太坊用的是ECDSA演算法,R和S就是ECSDA簽名輸出,V則是Recovery ID。
R,S,V是交易簽名後的值,它們可以被用來生成簽名者的公鑰;R,S是ECDSA橢圓加密演算法的輸出值,V是用於恢復結果的ID
H. 我能自己來運行 Eth 2.0 的驗證者嗎
可以!
你在運行自己的驗證者節點時,首先要意識到的是,你這樣做是有助於網路安全性的,而且你無需過度擔心正常運行時間。
假設網路總體上是健康的(始終有超過 2/3 的節點在線,並且一直在終局化新的區塊),在線時間超過 50% 的驗證者將看到自己的權益會不斷增加。
引用以太坊基金會的 ETH Staking 指南系列文章中的一句話:
這就減輕了驗證者在客戶端備份和網路延遲上的負擔,因為離線的懲罰並不那麼嚴重。
質押硬體成本較低且方便易用自己運行驗證者節點並不像你想像中那麼可怕或昂貴。一旦ETH 2.0上線,你就可以在一個舊手機或樹莓派(100 美元)上運行驗證者節點。
我們專門為開發者撰寫了關於如何使用 Nimbus 在安卓系統上運行驗證者節點的指南(分別是這篇和這篇)。在主網上線前,我們一直在盡可能簡化這一流程。尤其值得一提的是,主網指南將面向那些沒有編程經歷的用戶,而且會盡可能實現 「安裝 + 質押 ETH = 正常運行」。
你可以幫助以太坊增強抗攻擊性與其讓同一個實體控制 100 個節點,不如讓一個實體控制一個節點。——Barnabe Monnot
從長遠角度來看,以太坊的價值越高,抗攻擊性越強,其共識層的去中心化程度就越高。
中本聰最初的願景是 「一 CPU 一票制」,但是如今的 PoW 系統已經偏離了這一願景。就目前而言,絕大部分挖礦資源都集中在少數礦池手中。個體礦工都為了縮小自己收入的波動性而加入礦池。
我們之所以選擇從 PoW 模式轉向 PoS 模式,也是為了解決這一問題。
如果有越來越多人選擇自己運行驗證者節點,我們就可以將這一願景變為現實,增強以太坊的抗攻擊性,使之在無需審查的情況下不斷發展。
I. 走進以太坊網路
目錄
術語「以太坊節點」是指以某種方式與以太坊網路交互的程序。從簡單的手機錢包應用程序到存儲整個區塊鏈副本的計算機,任何設備均可扮演以太坊節點。
所有節點都以某種方式充當通信點,但以太坊網路中的節點分為多種類型。
與比特幣不同,以太坊找不到任何程序作為參考實施方案。在比特幣生態系統中, 比特幣核心 是主要節點軟體,以太坊黃皮書則提出了一系列獨立(但兼容)的程序。目前最流行的是Geth和Parity。
若要以允許獨立驗證區塊鏈數據的方式連接以太坊網路,則應使用之前提到的軟體運行全節點。
該軟體將從其他節點下載區塊,並驗證其所含交易的正確性。軟體還將運行調用的所有智能合約,確保接收的信息與其他節點相同。如果一切按計劃運行,我們可以認為所有節點設備均存儲相同的區塊鏈副本。
全節點對於以太坊的運行至關重要。如果沒有遍布全球的眾多節點,網路將喪失其抗審查性與去中心化特性。
通過運行全節點,您可以直接為網路的 健康 和安全發展貢獻一份力量。然而,全節點通常需要使用獨立的機器完成運行和維護。對於無法(或單純不願)運行全節點的用戶,輕節點是更好的選擇。
顧名思義,輕節點均為輕量級設備,可顯著降低資源和空間佔用率。手機或筆記本電腦等攜帶型設備均可作為輕節點。然而,降低開銷也要付出代價:輕節點無法完全實現自給自足。它們無法與整條區塊鏈同步,需要全節點提供相關信息。
輕節點備受商戶、服務供應商和用戶的青睞。在不必使用全節點並且運行成本過高的情況下,它們廣泛應用於支收付款。
挖礦節點既可以是全節點客戶端,也可以是輕節點客戶端。「挖礦節點」這個術語的使用方式與比特幣生態系統不同,但依然應用於識別參與者。
如需參與以太坊挖礦,必須使用一些附加硬體。最常見的做法是構建 礦機 。用戶通過礦機將多個GPU(圖形處理器)連接起來,高速計算哈希數據。
礦工可以選擇兩種挖礦方案:單獨挖礦或加入礦池。 單獨挖礦 表示礦工獨自創建區塊。如果成功,則獨享挖礦獎勵。如果加入 礦池 ,眾多礦工的哈希算力會結合起來。出塊速度得以提升,但挖礦獎勵將由眾多礦工共享。
區塊鏈最重要的特性之一就是「開放訪問」。這表明任何人均可運行以太坊節點,並通過驗證交易和區塊強化網路。
與比特幣相似,許多企業都提供即插即用的以太坊節點。如果只想啟動並運行單一節點,這種設備無疑是最佳選擇,缺點是必須為便捷性額外付費。
如前文所述,以太坊中存在眾多不同類型的節點軟體實施方案,例如Geth和Parity。若要運行個人節點,必須掌握所選實施方案的安裝流程。
除非運行名為 歸檔節點 的特殊節點,否則消費級筆記本電腦足以支持以太坊全節點正常運行。不過,最好不要使用日常工作設備,因為節點會嚴重拖慢運行速度。
運行個人節點時,建議設備始終在線。倘若節點離線,再次聯網時可能耗費大量的時間進行同步。因此,最好選擇造價低廉並且易於維護的設備。您甚至可以通過Raspberry Pi運行輕節點。
隨著網路即將過渡到權益證明機制,以太坊挖礦不再是最安全的長期投資方式。過渡成功後,以太坊礦工只能將挖礦設備轉入其他網路或直接變賣。
鑒於過渡尚未完成,參與以太坊挖礦仍需使用特殊硬體(例如GPU或ASIC)。若要獲得可觀收益,則必須定製礦機並尋找電價低廉的礦場。此外,還需創建以太坊錢包並配置相應的挖礦軟體。這一切都會耗費大量的時間和資金。在參與挖礦前,請認真考量自己能否應對各種挑戰。(國內嚴禁挖礦,切勿以身試法)
ProgPow代表 程序化工作量證明 。這是以太坊挖礦演算法Ethash的擴展方案,旨在提升GPU的競爭力,使其超過ASIC。
在比特幣和以太坊社區,抗ASIC多年來一直是飽受爭議的話題。在比特幣網路中,ASIC已經成為主要的挖礦力量。
在以太坊中,ASIC並不是主流,相當一部分礦工仍然使用GPU。然而,隨著越來越多的公司將以太坊ASIC礦機引入市場,這種情況很快就會改變。然而,ASIC到底存在什麼問題呢?
一方面,ASIC明顯削弱網路的去中心化。如果GPU礦工無法盈利,不得不停止挖礦,哈希率最終就會集中在少數礦工手中。此外,ASIC晶元的開發成本相當昂貴,坐擁開發能力與資源的公司屈指可數。這種現狀有可能導致以太坊挖礦產業集中在少數公司手中,形成一定程度的行業壟斷。
自2018年以來,ProgPow的集成一直飽受爭議。有些人認為,它有益於以太坊生態系統的 健康 發展。另一些人則持反對態度,認為它可能導致硬分叉。隨著權益證明機制的到來,ProgPoW能否應用於網路仍然有待觀察。
以太坊與比特幣是一樣,均為開源平台。所有人都可以參與協議開發,或基於協議構建應用程序。事實上,以太坊也是區塊鏈領域目前最大的開發者社區。
Andreas Antonopoulos和Gavin Wood出品的 Mastering Ethereum ,以及Ethereum.org推出的 開發者資源 等都是新晉開發者理想的入門之選。
智能合約的概念於20世紀90年代首次提出。其在區塊鏈中的應用帶來了一系列全新挑戰。2014年由Gavin Wood提出的Solidity已經成為開發以太坊智能合約的主要編程語言,其語法與Java、JavaScript以及C++類似。
從本質上講,使用Solidity語言,開發者可以編寫在分解後可由以太坊虛擬機(EVM)解析的指令。您可以通過Solidity GitHub詳細了解其工作原理。
其實,Solidity語言並非以太坊開發者的唯一選擇。Vyper也是一種熱門的開發語言,其語法更接近Python。
J. 如何購買以太坊,以太坊國內如何購買
目前,國內用戶購買以太坊的渠道有很多,下面簡單介紹常用的幾種:
1、關於可盈可樂
可盈可樂是個人與個人之間交易比特幣的場外交易平台。
可盈可樂隸屬於香港CoinCola Limited,由專業的國際化團隊研發與運營,專注於為全球用戶提供便捷,可依賴的區塊鏈服務。CoinCola匯聚全球用戶,致力於打造世界級的區塊鏈資產平台。
在可盈可樂,來自不同國家的人們可以用本國貨幣購買到比特幣。 網站的賣家發布出售比特幣的廣告,並說明付款方式和匯率。 您可根據廣告內容選擇直接在線交易。比特幣都存放在可盈可樂的網路錢包里,您可以直接進行比特幣轉賬。
2、如何購買以太坊(ETH)
注冊CoinCola賬戶,登陸後在首頁頂欄菜單點擊「購買」進入廣告列表頁面。
從廣告列表中選擇合適的廣告,點擊「購買ETH」進入交易頁面。
輸入需要購買的金額或者數字幣的數量(輸入前請了解對方的留言信息,收款方式,和平台的交易須知),點擊立即購買,彈出下單確認,核對和信息無誤後點擊確認購買,進入下單頁面。
在平台的聊天框根據模板語句咨詢對方是否在線,根據對方提供的收款信息和收款方式進行線下付款。
線下付款完成後第一時間點擊標記已付款完成,(請在下單開始時15分內完成此操作,避免訂單超時取消導致款項無法追回)然後在聊天框自定義輸入信息確認付款和請賣家確認收款及釋放數字幣。
頂欄進度條顯示已收貨,說明數字幣已到錢包,根據賣家的行為進行評論,點擊提交,完成交易。
關於交易平台的C2C交易,隨著交易平台的數量劇增和競爭壓力,很多交易平台都會有自己的C2C交易,這里我們以比較大的ZB交易平台為例給大家進行說明;
1、C2C是什麼?
C2C交易就是客戶對客戶的交易,由交易平台提供擔保。這樣的平台有很多,比如:火幣、otcbtc、比特派OTC等,都是由平台提供擔保,用戶之間進行交易的模式。我們可以簡單理解為:我們在淘寶網購物的情形,和那一樣。如有糾紛,平台進行仲裁。只要按照正常的流程進行交易,交易的安全性能得到保障。
2、ZB的C2C業務
ZB平台通過法幣可以購買的選擇有兩個:QC和USDT,基本的邏輯是一樣的,USDT很多平台都有,QC目前是ZB、EXX等幾個平台的特色,這里重點介紹QC。
QC是一種代幣,目前市面上大家可能相對了解多一些的是USDT和BITCNY。ZB上面目前有QC交易的專區,簡單來說就是可以用QC買到ZB上面的所有其他數字貨幣(BTC、ETH、EOS等),所以,用RMB充值購買QC後,就可以在ZB站內進行幣幣交易。
和人民幣的兌換比例1:1,比較易於換算。
用QC購買其他代幣,可以直觀的理解為人民幣購買,對貨幣價格有直觀的了解。
到賬速度快,正常半個小時左右。擁堵時2個小時左右到賬。
ZB平台相對可靠,ZB的信譽度從過往來看還是很不錯。
3、ZB的C2C如何操作?
登錄ZB交易平台 ,點擊頁面上放的 「C2C交易」。
到達QC交易頁面,需要首先綁定一張你的銀行卡。然後,在買入QC的界面,輸入你想要購買的QC數量。目前QC和人民幣的比例是1:1。輸入買入數量後點擊「立即買入」。
點擊「立即買入」後,會提示你30分鍾內完成付款。同時生成付款信息。請注意,務必按照提示的要求打款。
商家處理時間9:00 - 21:00。非處理時間的訂單會在第二天9:00開始處理,一般接單後24小時內會完成打款。
這里指的是你打款過去的商家會在24小時內將QC幣轉至你的賬戶。根據我的經驗,白天一般2個小時之內就可以到賬。
1) 務必使用剛剛綁定的銀行卡轉賬打款。
2) 備注信息(那個6位數字)一定要填寫
3) 務必不要使用支付寶、微信等轉賬。
4) 對方賬號不要填寫錯誤。
1-2小時左右,可以在財務中心查詢你的QC是否到賬。
到賬後,就可以在「現貨交易」裡面的「QC」專區進行交易了。可以選擇你想要買入的交易對掛單買入。