以太坊公有鏈節點部署
⑴ Docker 搭建以太坊私有鏈
首先需要安裝 Docker,Docker 的安裝和使用可以參看阮一峰老師的 《Docker 入門教程》 。
Ethereum 官方是支持 docker 的,可以參看 官方文檔 。
centOS
其中 -v /home/linshan/works/block-chain/ethereum:/root 是把我們當前的 ethereum 目錄,掛到了docker 的 /root 下。
在 Windows 環境下使用 -v /home/linshan/works/block-chain/ethereum:/root 不能啟動容器,原因不明,所以在 Windows 下先不要使用目錄掛載。
各欄位具體用途參看 官方文檔 。
Windows
Windows 不必創建 start-ethereum.sh 文件, genesis.json 也可以在 Docker 容器啟動後創建。
centOS
Windows
運行成功後執行
進入 docker 容器命令行
因為 Windows 沒有掛載共享目錄,所以 root 目錄下沒有 genesis.json 文件,我們要在這裏手動創建 genesis.json 文件,內容要和 centOS 的一致。
data 用來存放區塊數據
geth 的參數參看 以太坊客戶端Geth命令用法-參數詳解
啟動私有節點後進入 geth 命令行執行:
輸出的內容就是節點信息,我們在手動連接節點是會用到,注意要把「0.0.0.0「換成你自己的IP,然後將這個信息發送給其他節點。手動連接節點有兩種方式:
當然不管使用哪種方法連接節點都要保證創世區塊文件 genesis.json 一致,還有在啟動時 networkid 也要一致。
至此以太坊私有鏈已搭建完畢。
geth命令
docker命令
⑵ 怎麼接以太坊公鏈
建立連接以接儒以太坊公鏈。
一、1、以太坊客戶端下載,注意:需翻牆,下載版本為1.8.23-stable,否則可能出現與以太坊錢包客戶端存在不匹配問題。
2、以太坊錢包客戶端下載。
3、安裝以太坊客戶端。
二、私有鏈創建:創建創世區塊。
三、安裝並啟動以太坊錢包客戶端。
⑶ 2022以太坊節點數量
2022以太坊節點數量是2000多點。根據查詢相關公開信息顯示,截止於2022年11月30日,2022以太坊節點數量達到了2000多點,數量非常的穩定龐大,能夠體現出目前以太幣的強勢和利好,非常適合投資。以太坊是一個開源的有智能合約功能的公共區塊鏈平台,通過其專用加密貨幣以太幣提供去中心化的以太虛擬機來處理點對點合約。
⑷ 如何部署Qtum量子鏈節點
獲取Qtum節點
可以通過以下四種方法之一獲得Qtum節點程序:
1. 直接下載二進制文件
如果你並不關心Qtum的源碼,部署Qtum節點最方便的方法是在Qtum release page(點擊打開)下載最新的二進制文件,目前支持的平台包括Linux,Windows,OSX。建議選擇最新版進行下載,本教程以撰寫時的最新版v0.14.13為例。
(注意,你所看到最新版的版本號可能不同,如這里是0.14.13,其他字元串保持不變)
Mac用戶請下載:qtum-0.14.13-osx64.tar.gz
Linux用戶請下載:qtum-0.14.13-i686-pc-linux-gnu.tar.gz(32位)或qtum-0.14.13-x86_64-linux-gnu.tar.gz(64位)
Windows用戶請下載:qtum-0.14.13-win32.zip(32位)或qtum-0.14.13-win64.zip(64位)
樹莓派用戶請下載:qtum-0.14.13-arm-linux-gnueabihf.tar.gz
下載壓縮包解壓後,<解壓路徑>/bin/下包含qtumd和qtum-cli,即為本教程要用到的Qtum節點可執行文件。
⑸ 可以用雲伺服器搭建以太坊私有鏈節點嗎
可以的,但是建議使用海外伺服器會比較好,另外伺服器的配置要中等或以上。
⑹ 公鏈需要伺服器嗎
需要。
公鏈也稱「公有鏈」,所謂公和私區別就在於鏈上的節點是否是自己可控,公有鏈對應的就是私有鏈;比特幣、以太坊是時下最流行的公有鏈。
公有鏈是指全世界任何人都可以隨時進入到系統中讀取數據、發送可確認交易、競爭記賬的區塊鏈。公有鏈通常被認為是「完全去中心化」的,因為沒有任何個人或者機構可以控制或篡改其中數據的讀寫。
公有鏈一般會通過代幣機制(Token)來鼓勵參與者競爭記賬,來確保數據的安全性。從應用上說,區塊鏈公有鏈包括比特幣、以太坊、超級賬本、大多數山寨幣以及智能合約,其中區塊鏈公有鏈的始祖是比特幣區塊鏈。
目前,大多數以太坊項目都依靠以太坊作為公有鏈,以太坊是一個全新開放的區塊鏈平台,它允許任何人在平台中建立和使用通過區塊鏈技術運行的去中心化應用。 以太坊是可編程的區塊鏈 ,允許用戶按照自己的意願創建復雜的操作,可以作為多種類型去中心化區塊鏈應用的平台。
除金融類應用外,任何對信任、安全和持久性要求較高的應用場景,比如資產注冊、投票、管理和物聯網等等3.0時代應用,都會大規模地受到以太坊平台影響。
⑺ 以太坊技術系列-以太坊數據結構
本篇文章和大家介紹一下以太坊的數據結構,上篇文章我們提到,以太坊為了實現智能合約這一功能,使用了基於賬戶的模型。我們來看看以太坊中數據結構。
既然是基於賬戶的模型,我們需要通過賬戶地址找到賬戶的狀態。就像通過銀行卡號可以找到你在銀行中的各種信息一樣。最簡單的想法當然是一個簡單的哈希表 key是賬戶地址 value是賬戶狀態。但這里有個問題解決不了。
輕節點如何校驗賬戶合法性?
上篇我們說過,區塊鏈中有2類節點,全節點和輕節點,輕節點只會存儲block header,所以輕節點如何才能校驗賬號是否合法呢?
這個思路和我們平時用的md5校驗一致,我們會對區塊內的信息進行hash運算從而得出區塊內信息唯一確定的值,區塊鏈所有節點中這個值都是相同的。
在這個過程中我們用到了一種數據結構Merkle Tree(哈希樹),我們先看下Merkle Tree(哈希樹)的示意圖。
上篇文章說到區塊鏈中的鏈表(哈希鏈)和我們平時常見鏈表不同的是將指針從地址改為了hash指,這里也一樣,哈希樹和二叉樹的區別有2個
1.將地址改為了哈希值
2.只有葉子節點存儲數據
回到之前的問題輕節點是如何校驗1個賬戶或交易是否是在鏈上的呢?
整個流程如上圖所示
1.輕節點需要判斷1個賬號是否合法
2.輕節點由於只存儲block header,所以拿到1個賬號的時候會向全節點發出請求
3.全節點存儲了所有賬戶狀態,將賬戶路徑中的需要計算用到的hash值返回給輕節點
4.輕節點本地進行計算根hash值,如果計算結果和自己存儲一致則賬戶合法,不一致則不合法。
那以太坊中的賬戶信息的數據結構就是這樣嗎?
直接用這樣的數據結構來存儲賬戶信息會有2個問題
查找困難
生成hash值不確定
第1個問題應該比較容易發現,在這個樹中尋找1個賬號需要的復雜度是O(n),因為沒有任何順序。
第2個問題其實也是因為無序導致的,無序的組合每個節點針對同一批賬戶生成的hash值不一致,這就導致無法達成共識。
既然2個問題都和順序有關,那我們類似二叉排序樹一樣,使用哈希排序樹是不是就可以解決問題了呢?
使用排序樹後會帶來另外1個問題
插入困難
因為要維持樹是有序的,很可能帶來樹結構的很大變動。
以太坊中使用了另外一種數據結構字典樹。和哈希樹不同,字典樹應該是很多地方都有使用。我們簡單來看下字典樹的結構。
字典樹能夠較好地解決哈希樹的2個缺點1.查找困難 2.生成的hash值不確定以及排序二叉樹的1個缺點 插入困難。
但字典樹我們可以看到可能樹的深度可能由於部分元素導致整棵樹深度非常深。
這時我們可以進一步優化,將相同路徑進行壓縮。這就是壓縮字典樹。
將哈希樹和壓縮字典樹結合,就可以得到以太坊存儲賬戶的最終數據結構-MPT。
將壓縮字典樹裡面的指針從地址改為指針,並且將數據存儲在葉子節點中即可。
介紹完狀態樹的數據結構,我們接下來討論1個問題,區塊中存儲的賬戶狀態是什麼樣的范圍。有2種選擇。
只保存當時區塊中產生交易的賬戶狀態。
保存全局所有的賬戶。
我們可以看下這2種方式,無非就是空間和時間的平衡,只保存當前區塊產生的交易意味著是做懶載入(需要的時候才去尋找賬戶),在區塊鏈中這個代價是非常大的,因為尋找的賬戶之前從未交易過,這樣會遍歷整個區塊鏈。另外一種保存全局的賬戶方式雖然看起來空間消耗較大,但查找快捷,而且空間的問題我們可以通過其他方式優化。所以最終以太坊選擇了第2種每個區塊都報錯全局所有賬戶的方式。
我們來看下以太坊中是如何保存狀態樹的。
可以看到以太坊中雖然每個區塊都保存了全部賬戶,但是會將未發生變化的賬戶狀態指向前1個節點,本身只存儲發生變化的狀態,這樣可以較大程度優化空間佔用。
介紹完以太坊中比較復雜的狀態樹後,我們繼續來看看以太坊中的另外兩棵樹,交易樹和收據樹。
首先介紹一下,為什麼需要交易樹&收據樹。
1.交易樹
雖然以太坊是基於賬戶的模型,但是就像銀行不僅會存儲銀行卡的余額,還會存儲卡中的每筆錢怎麼來的以及怎麼花的。交易樹中就存儲著當前區塊中的包含的所有交易。
2.收據樹
由於智能合約的引入增加了不少復雜性,所以以太坊用收據樹存儲著一些交易操作的額外信息。比如交易過程中執行日誌就包含在收據樹中方便查詢。收據樹和交易樹是一一對應的。每發生一次交易就會有一次收據。
和狀態樹不同交易樹和收據樹只維護當前區塊內發生的交易,因為當時區塊發生交易時不需要再去查找另外1個交易,也就之前需要可能遍歷整個區塊鏈的查找操作了。
由於以太坊中的出塊速度較快,我們進行一些查詢一些符合條件交易的時候會面臨大量數據遍歷困難的問題。收據樹中引入了布隆過濾器可以幫助我們有效緩解這一困難。
布隆過濾器將大集合中每個元素進行hash運算映射到1個較小的集合,這時再來1個元素要判斷是否在大集合的時候,不需要遍歷整個大集合,而是去進行hash運算去小集合中尋找是否存在,如果不存在,肯定不在大集合中,如果存在則不能說明任何問題。
如上圖所示,布隆過濾器只能證明某1個元素不在集合中,不能證明1個元素在結合中。
以太坊中如果我們要在較多區塊中尋找某1個交易,則可以利用布隆過濾器,過濾掉肯定不存在目標交易的區塊,然後進入收據樹內繼續利用布隆過濾器篩選,剩下的才是可能的目標交易的交易,進行一一比對即可。
我們介紹了以太坊的核心數據結構,狀態樹&交易樹&收據樹,他們都是使用相同的數據結構-哈希壓縮字典樹。但狀態樹是維護1顆全局賬戶樹,交易樹和收據樹則是維護本區塊內的交易或收據。
介紹完數據結構後,後面我們會用幾篇文章來介紹以太坊中的一些核心演算法,比如共識機制,挖礦演算法等。
⑻ 以太坊多節點私有鏈部署
假設兩台電腦A和B
要求:
1、兩台電腦要在一個網路中,能ping通
2、兩個節點使用相同的創世區塊文件
3、禁用ipc;同時使用參數--nodiscover
4、networkid要相同,埠號可以不同
1.4 搭建私有鏈
1.4.1 創建目錄和genesis.json文件
創建私有鏈根目錄./testnet
創建數據存儲目錄./testnet/data0
創建創世區塊配置文件./testnet/genesis.json
1.4.2 初始化操作
cd ./eth_test
geth --datadir data0 init genesis.json
1.4.3 啟動私有節點
1.4.4 創建賬號
personal.newAccount()
1.4.5 查看賬號
eth.accounts
1.4.6 查看賬號余額
eth.getBalance(eth.accounts[0])
1.4.7 啟動&停止挖礦
啟動挖礦:
miner.start(1)
其中 start 的參數表示挖礦使用的線程數。第一次啟動挖礦會先生成挖礦所需的 DAG 文件,這個過程有點慢,等進度達到 100% 後,就會開始挖礦,此時屏幕會被挖礦信息刷屏。
停止挖礦,在 console 中輸入:
miner.stop()
挖到一個區塊會獎勵5個以太幣,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做 coinbase,默認情況下 coinbase 是本地賬戶中的第一個賬戶,可以通過 miner.setEtherbase() 將其他賬戶設置成 coinbase。
1.4.8 轉賬
目前,賬戶 0 已經挖到了 3 個塊的獎勵,賬戶 1 的余額還是0:
我們要從賬戶 0 向賬戶 1 轉賬,所以要先解鎖賬戶 0,才能發起交易:
發送交易,賬戶 0 -> 賬戶 1:
需要輸入密碼 123456
此時如果沒有挖礦,用 txpool.status 命令可以看到本地交易池中有一個待確認的交易,可以使用 eth.getBlock("pending", true).transactions 查看當前待確認交易。
使用 miner.start() 命令開始挖礦:
miner.start(1);admin.sleepBlocks(1);miner.stop();
新區塊挖出後,挖礦結束,查看賬戶 1 的余額,已經收到了賬戶 0 的以太幣:
web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
用同樣的genesis.json初始化操作
cd ./eth_test
geth --datadir data1 init genesis.json
啟動私有節點一,修改 rpcport 和port
可以通過 admin.addPeer() 方法連接到其他節點,兩個節點要要指定相同的 chainID。
假設有兩個節點:節點一和節點二,chainID 都是 1024,通過下面的步驟就可以從節點二連接到節點一。
首先要知道節點一的 enode 信息,在節點一的 JavaScript console 中執行下面的命令查看 enode 信息:
admin.nodeInfo.enode
" enode://@[::]:30303 "
然後在節點二的 JavaScript console 中執行 admin.addPeer(),就可以連接到節點一:
addPeer() 的參數就是節點一的 enode 信息,注意要把 enode 中的 [::] 替換成節點一的 IP 地址。連接成功後,節點一就會開始同步節點二的區塊,同步完成後,任意一個節點開始挖礦,另一個節點會自動同步區塊,向任意一個節點發送交易,另一個節點也會收到該筆交易。
通過 admin.peers 可以查看連接到的其他節點信息,通過 net.peerCount 可以查看已連接到的節點數量。
除了上面的方法,也可以在啟動節點的時候指定 --bootnodes 選項連接到其他節點。 bootnode 是一個輕量級的引導節點,方便聯盟鏈的搭建 下一節講 通過 bootnode 自動找到節點
參考: https://cloud.tencent.com/developer/article/1332424
⑼ 搭建geth私有鏈和聯盟鏈網路
操作系統:linux或Mac OS
安裝geth執行以下命令:
linux:sudo apt-get install ethereum
Mac OS:brew install ethereum
直接創建兩個geth的工作目錄,用於之後的組建聯盟鏈的使用:
mkdir eth-private1
mkdir eth-private2
首先 cd eth-private1 進入節點1的工作目錄該目錄下執行下面命令
geth --datadir data --nodiscover console (data是之後geth節點的數據目錄,可自行修改)
使用geth自帶的工具 puppeth 用於生成創世區塊,過程如下:
puppeth
+-----------------------------------------------------------+
| Welcome to puppeth, your Ethereum private network manager |
| |
| This tool lets you create a new Ethereum network down to |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail. |
| |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset. |
+-----------------------------------------------------------+
Please specify a network name to administer (no spaces, please)
輸入私鏈名稱後,會出現二級菜單,現在2:配置一個新的創世快
What would you like to do? (default = stats)
再次出現二級菜單,讓你選擇共識機制(這里採用poa共識)
Which consensus engine to use? (default = clique)
Ethash - proof-of-work(PoW) :工作量證明,通過算力達成共識 (以太坊就是使用這種方式)
Clique - proof-of-authority(PoA): 權威證明、通過預先設定的權威節點來負責達成共識 (不消耗算力,一般用於私有鏈測試開發)
如果選擇Pow的共識方法,直接輸入1,回車即可。
如果選擇PoA的共識方法,輸入2後會提示讓你選擇處快的間隔時間,一般測試開發使用可以設置相對的將處快時間設置較少5秒即可,然後會讓你選擇哪個賬戶來作為權威生成區塊(至少有一個,輸入剛才創建的賬戶,若只是單節點就輸入那個節點目錄生成的地址,若想組建聯盟鏈就填寫生成的兩個地址)
How many seconds should blocks take? (default = 15)
選擇好共識機制後會讓你指定給那些賬號初始化ether(至少有一個),輸入我們剛才創建的賬戶地址回車即可。
Which accounts should be pre-funded? (advisable at least one)
選擇輸入私有鏈的網路ID,任意數字即可(不能為1,1是公鏈),也可以不輸入會給定一個隨機數作為私有鏈的網路ID
Specify your chain/network ID if you want an explicit one (default = random)
選擇導出創世區塊配置文件
選擇導出創世區塊配置文件的保存路徑,可以保存到當前目錄,直接按回車即可
Which file to save the genesis into? (default = my-private-chain.json)
INFO [02-09|14:56:33] Exported existing genesis block
這樣就完成了創世區塊文件的配置了,直接退出puppeth即可。
輸入命令 geth --datadir data init private.json 其中data自己制定,private.json就是剛才生成的創世區塊
若出現如圖錯誤:
輸入命令:
geth --datadir data --syncmode full --port 2001 --networkid 1234 --rpc --rpcport "8545" --rpccorsdomain "*" --rpcaddr "0.0.0.0" --rpcapi "db,eth,net,web3,personal,admin,clique" --nodiscover console 進入控制台
--datadir data:節點的數據目錄
--syncmode full:塊同步的方式(若只是單節點可不填)
--port 2001: 網卡監聽埠
--networkid 1234:網路標識符
--rpc:開啟rpc服務
--rpcport "8545":rpc服務的埠
--rpccorsdomain "*":允許跨域請求的域名列表(逗號分隔)(瀏覽器強制)
--rpcaddr "0.0.0.0" :HTTP-RPC伺服器介面地址(默認值:「localhost」)
--rpcapi "db,eth,net,web3,personal,admin,clique":基於HTTP-RPC介面提供的API(私有鏈可以任意開發,公有鏈需要謹慎)
--nodiscover:不允許節點自動加入
若想搭建聯盟鏈,必須保證創世區塊一致,進入到剛才創建的eth-private2的目錄
將之前生成的創世區塊拷貝過來,初始化創世區塊,然後使用啟動命令啟動分別啟動兩個節點,進入控制台,使用 admin.nodeInfo 命令獲取節點的信息
總結:
兩個伺服器部署兩個節點是可以聯通的,但是只能使用兩個節點對應的地址進行挖礦,所以只能是兩個節點對應兩個地址進行挖礦,使用poa共識,當一個節點掛掉,挖礦停止,因為poa共識挖礦必須超過50%的節點進行錢增,現在只是兩個節點,掛掉一個節點挖礦就會停止等待另一個節點的確認,停掉的節點可以通過正常運作的節點信息重新連接到網路中。
問題:
同步塊有可能報錯情況:
1:Synchronisation failed "retrieved hash chain is invalid" 解決目前找到的方法是removedb 數據目錄 ,重新init創世區塊
2:內存溢出初步確認為開啟rpc服務造成的,有可能伺服器惡意被黑,暴力破解密碼,佔有內存,解決,將伺服器的ip設置一條防火牆
若存在問題可給本人留言或訪問本人的github: https://github.com/qi-shuo/geth-document 記錄了一些本人搭建使用的命令
⑽ 公有鏈的安全主要由什麼等方式負責維護
公有鏈:是指全世界任何人都可以隨時進入到系統中讀取數據、發送可確認交易、競爭記賬的區塊鏈。例如:比特幣、以太坊。
私有鏈:是指其寫入許可權由某個組織和機構控制的區塊鏈,參與節點的資格會被嚴格限制。
聯盟鏈:是指有若干個機構共同參與管理的區塊鏈,每個機構都運行著一個或多個節點,其中的數據只允許系統內不同的機構進行讀寫和發送交易,並且共同來記錄交易數據。
聯盟鏈是一種將區塊鏈技術應用於企業的相對較新的方式。公有鏈向所有人都開放,而私有鏈通常只為一個企業提供服務,聯盟鏈相對公鏈來說有更多限制,通常為多個企業之間的共同協作提供服務。
聯盟鏈與公有鏈的不同之處在於,它是需要獲得事先許可的。因此並不是所有擁有互聯網連接的任何人都可以訪問聯盟區塊鏈的。聯盟鏈也可以描述為半去中心化的,對聯盟鏈的控制權不授予單個實體,而是多個組織或個人。
對於聯盟鏈,共識過程可能與公有鏈不同。聯盟鏈的共識參與者可能是網路上的一組預先批準的節點,而不是任何人都可以參與該過程。聯盟鏈允許對網路進行更大程度的控制。
那說到聯盟鏈的優點:
首先,聯盟鏈受一個特定群體的完全控制,但並不是壟斷。當每個成員都同意時,這種控制可以建立自己的規則。
其次,具有更大的隱私性,因為來驗證區塊的信息不會向公眾公開,只有聯盟成員可以進行處理這些信息。它為平台客戶創造了更大的信任度和信心。
最後,與公共區塊鏈相比,聯盟鏈沒有交易費用,更靈活一些。公共區塊鏈中大量的驗證器導致同步和相互協議的麻煩。通常這種分歧會導致分叉,但聯盟鏈不會出現這種狀況。
聯盟鏈技術可以用來優化大多數傳統信息化系統的業務流程,特別適用於沒有強力中心、多方協作、風險可控的業務場景。聯盟鏈的共享賬本機制可以極大降低該類場景下的對賬成本、提高數據獲取效率、增加容錯能力、鞏固信任基礎、以及避免惡意造假。
隨著區塊鏈技術的不斷發展,越來越多的機構與企業開始加大對區塊鏈的研究與應用。相比公鏈而言,聯盟鏈具有更好的落地性,受到了許多企業與政府的支持。
聯盟鏈可以理解為是為了滿足特定行業需求,內部機構建立起來的一種分布式賬本。這個賬本對內部機構是公開透明的,但如果有相關業務需求,對該賬本的數據進行修改,則還是是需要智能合約的加入。
智能合約(Smart contract )是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議。智能合約允許在沒有第三方的情況下進行可信交易,這些交易可追蹤且不可逆轉。
總體來說,目前聯盟鏈智能合約的主流架構是:系統合約 + 業務合約。
系統合約:在節點啟動前配置完成,一般用於系統管理(如BCOS的預編譯合約(許可權管理、命名管理等),由項目方編寫,安全性較高。
業務合約:根據實際業務編寫而成,需要部署,類似公鏈智能合約,由一般內部機構參與方編寫,需遵守一定的要求,安全性一般。
聯盟鏈合約相較於常規公鏈在規范性、和安全性都有一定的提升,但在以下幾個方面的安全性問題,仍可能存在安全風險:
(1)、代碼語言安全特性
一種是繼續沿用主流公鏈編程語言,並在其基礎上改進(如:BCOS使用的solidity),另一種則是以通用編程語言為基礎,指定對應的智能合約模塊(如:fabric的Go/Java/Node.js),不管使用什麼語言對智能合約進行編程,都存在其對應的語言以及相關合約標準的安全性問題。
(2)、合約執行所帶來的安全性問題
整型溢出:不管使用的何種虛擬機執行合約,各類整數類型都存在對應的存儲寬度,當試圖保存超過該范圍的數據時,有符號數就會發生整數溢出。
堆棧溢出:當定義方法參數和局部變數過多,位元組過大,可能使程序出現錯誤。
拒絕服務攻擊:主要涉及到的是執行合約需要消耗資源的聯盟鏈,因資源耗盡而無法完成對應的交易。
(3)、系統機制導致的合約安全問題
這里主要是指多鏈架構的聯盟鏈:
合約變數的生成如果依賴於不確定因素(如:本節點時間戳)或者某個未在賬本中持久化的變數,那麼可能會因為各節點該變數的讀寫集不一樣,導致交易驗證不通過。
全局變數不會保存在資料庫中,而是存儲於單個節點。因此,如果此類節點發生故障或重啟時,可能會導致該全局變數值不再與其他節點保持一致,影響節點交易。因此,從資料庫讀取、寫入或從合約返回的數據不應依賴於全局狀態變數。
在多鏈結構下進行外部鏈的合約調用時,可能僅會得到被調用鏈碼函數的返回結果,而不會在外部通道進行任何形式的交易提交。
合約訪問外部資源時,可能會暴露合約未預期的安全隱患,影響鏈碼業務邏輯。
(4)、業務安全問題
聯盟鏈的智能合約是為了完成某項業務需求執行某項業務,因此在業務邏輯和業務實現上仍是可能存在安全風險的,如:函數許可權失配、輸入參數不合理、異常處理不到位。
我們對聯盟鏈安全的建議:
(1)、簡化智能合約的設計,做到功能與安全的平衡
(2)、嚴格執行智能合約代碼審計(自評/項目組review/三方審計)
(3)、強化對智能合約開發者的安全培訓
(4)、在區塊鏈應用落地上,需要逐步推進,從簡單到復雜,在此過程中不斷梳理合約與平台相關功能/安全屬性
(5)、考慮DevSecOps(Development+Security+Operations)的思想
鏈平台安全包括:交易安全、共識安全、賬戶安全、合規性、RPC安全、端點安全、P2P安全等。
黑客攻擊聯盟鏈的手法包括:內部威脅、DNS攻擊、MSP攻擊、51%的攻擊等。
以MSP攻擊為例:MSP是Fabric聯盟鏈中的成員服務提供商(Membership Service Provider)的簡稱,是一個提供抽象化成員操作框架的組件,MSP將頒發與校驗證書,以及用戶認證背後的所有密碼學機制與協議都抽象了出來。一個MSP可以自己定義身份,以及身份的管理(身份驗證)與認證(生成與驗證簽名)規則。
針對MSP的攻擊,一般來說,可能存在如下幾個方面:
(1)、內部威脅:a)當前版本的MSP允許單個證書控制,也就是說,如果某個內部人員持有了可以管理MSP的證書,他將可以對Fabric網路進行配置,比如添加或撤消訪問許可權,向CRL添加身份(本質上是列入黑名單的身份),過於中心化的管理可能導致安全隱患。 b)如果有感測器等物聯網設備接入聯盟鏈,其可能傳播虛假信息到鏈上,並且因為感測器自身可能不支持完善的安全防護,可能導致進一步的攻擊。
(2)、私鑰泄露,節點或者感測器的證書文件一般存儲在本地,可能導致私鑰泄漏,進而導致女巫攻擊、雲中間人攻擊(Man-in-the-Cloud attack)等
(3)、DNS攻擊:當創建新參與者的身份並將其添加到MSP時,在任何情況下都可能發生DNS攻擊。向區塊鏈成員創建證書的過程在許多地方都可能發生攻擊,例如中間人攻擊,緩存中毒,DDOS。攻擊者可以將簡單的DNS查詢轉換為更大的有效載荷,從而引起DDoS攻擊。與CA攻擊類似,這種攻擊導致證書篡改和/或竊取,例如某些區塊鏈成員將擁有的許可權和訪問許可權。感測器網路特別容易受到DDOS攻擊。智慧城市不僅面臨著實施針對DDOS攻擊的弱點的感測器網路,而且面臨著弱點的伴隨的區塊鏈系統的挑戰。
(4)、CA攻擊:數字證書和身份對於MSP的運行至關重要。Hyperledger Fabric允許用戶選擇如何運行證書頒發機構並生成加密材料。選項包括Fabric CA,由Hyperledger Fabric,Cryptogen的貢獻者構建的過程,以及自己的/第三方CA。這些CA本身的實現都有其自身的缺陷。 Cryptogen在一個集中的位置生成所有私鑰,然後由用戶將其充分安全地復制到適當的主機和容器中。通過在一個地方提供所有私鑰,這有助於私鑰泄露攻擊。除了實現方面的弱點之外,MSP的整體以及因此區塊鏈的成員資格都在CA上運行,並且具有信任證書有效的能力,並且證書所有者就是他們所說的身份。對知名第三方CA的攻擊如果成功執行,則可能會損害MSP的安全性,從而導致偽造的身份。Hyperledger Fabric中CA的另一個弱點是它們在MSP中的實現方式。 MSP至少需要一個根CA,並且可以根據需要支持作為根CA和中間CA。如果根CA證書被攻擊,則會影響所有根證書簽發的證書。
成都鏈安已經推出了聯盟鏈安全解決方案,隨著聯盟鏈生態的發展,2020年成都鏈安已配合多省網信辦對當地政企事業單位的聯盟鏈系統進行了從鏈底層到應用層多級安全審計,發現多場景多應用多形態的聯盟鏈系統及其配套系統的漏洞和脆弱點。
並且,成都鏈安已與螞蟻區塊鏈開展了合作,作為螞蟻區塊鏈優選的首批節點加入開放聯盟鏈,我們將發揮安全技術、服務、市場優勢,與開放聯盟鏈共拓市場、共建生態、並為生態做好安全保駕護航。
一方面我們的智能合約形式化驗證產品VaaS將持續為開放聯盟鏈應用提供『軍事級』的安全檢測服務,為應用上線前做好安全檢測,預防其發生安全和邏輯錯誤;我們的『鷹眼』安全態勢感知系統採用AI+大數據技術,為開放聯盟鏈及其應用提供全面及時的『安全+運營』態勢感知、鏈上合約風險監測、安全預警、報警、防火牆阻斷及實時響應處理能力。
另一方面,我們的安全產品已經積累了數十萬的客戶群體,我們將發揮我們的全球客戶資源和市場優勢,與開放聯盟鏈共拓市場。
在聯盟鏈平台上,我們能提供全生命周期的整體安全解決方案,成都鏈安以網路安全、形式化驗證、人工智慧和大數據分析四大技術為核心,打造了面向區塊鏈全生態安全的『Beosin一站式區塊鏈安全服務平台』。
『Beosin一站式區塊鏈安全服務平台』包含四大核心安全產品和八大明星安全服務,為區塊鏈企業提供安全審計、虛擬資產追溯與AML反洗錢、安全防護、威脅情報、安全咨詢和應急等全方位的安全服務與支持,實現區塊鏈系統『研發→運行→監管』全生命周期的安全解決方案。
我們會積極發揮區塊鏈安全頭部企業優勢,共同構建安全的區塊鏈商業網路,推動區塊鏈產業健康、安全的發展,探索區塊鏈未來的無限可能。