以太坊私有鏈合約發布失敗
① 以太坊存在的問題
1.擴展性不足:
以太坊社區的主要開發人員和研究人員始終認為區塊鏈技術要實現大規模採用,可擴展性是區塊鏈應用程序需要解決的唯一最重要的關鍵。
以太坊的底層設計,最大的問題是以太坊只有一條鏈,沒有側鏈,它把所有的程序對等的跑在全球所有節點的礦機上。這樣一個很耗資源的程序,會導致問題越來越嚴重。
2.合約程序漏洞,無法抵禦DDOS攻擊
據相關研究表明,在基於以太坊的近100萬個智能合約上,發現有34,200(約3%)個含有安全漏洞,將允許黑客竊取ETH、凍結資產或刪除合約。這幾年,以太坊面對合約程序漏洞和DDOS攻擊的問題,也一直無法找到很好的解決辦法。(更好用的數字貨幣交易平台「幣匯」)
3.對於ICO泡沫和項目方砸盤
目前的ETH下跌,很大程度上來自於項目方的砸盤套現,這個問題可以在ICO代幣融資上進行規則限制,不能像現在這樣毫無成本的就能發一個幣,而且還沒有任何監督懲罰機制。任何事情都需要有一套合理的演進規則,大家按規則辦事,所謂無規矩不成方圓。在規則的基礎上,各類ICO項目有效監督,有序進出,才是一個正常的市場,這樣才可能維系著代幣生態的持續、穩定發展。
4.智能合約費用過高
在以太坊上現在還是POW的挖礦模式,交易是有手續費的,用來激勵礦工來處理交易和保護網路,不同的是以太坊是以「gas」的形式來收費的。
在以太坊協議中規定,交易手續費=Gas 數量 x Gas 價格,其中 Gas 數量由智能合約的復雜程度決定,而 Gas 價格則由合約發起人決定。這對開發者和用戶意味著什麼呢?雖然讀取本地區塊鏈是免費的,但寫入和運算是花錢的,儲存更是尤其昂貴,因為任何寫入的信息都會被永久的儲存著。
5.社區對共識協議改變的分歧
以太坊計劃實現將 POW 機制改為 POW/POS 混合共識機制。但這個涉及到技術開發和礦工雙方能否達到利益共識的問題了。如果協議發生了變化,社區意見不合時,就會導致分叉,大家各自玩各自的。
② CentOS 6.5上搭建以太坊私有鏈,編譯時報錯: make: *** [geth] Error 1,請各位大神指教
build/env.sh go run build/ci.go install ./cmd/geth
make: *** [geth] Error 1
沒有這個目錄,或者這個目錄許可權不夠
③ 在區塊鏈中以太坊(eth)目前有哪些問題
在區塊鏈中以太坊(eth)目前有哪些問題?
以太坊區塊鏈目前暴露出三大問題,長時間以來其創始人Vitalik
Buterin一直無力解讀。第一是以太坊區塊鏈整體很低的性能和TPS;第二是資源不隔離,CryptoKitties虛擬貓咪的事件,一度占據了整個以太坊
20%
的流量,直接造成以太坊網路用戶無法展開及時的交易,就是資源不隔離最大的痛點;第三個問題在於以太坊治理結構的體現,區塊鏈作為去中心化的分布式賬本,以太坊過去以來,創始人團隊主導了其網路發展,過於中心化的治理模式,讓目前的以太坊出現了ETH、ETC、ETF等分叉,以太坊社區目前進入四分五裂的治理狀態。而以太坊網路目前出現的各種弊病,在「aelf」創始人與CEO馬昊伯看來,這是無法接受的。於是,「aelf」定位,就是為對標以太坊的下一代去中心化底層計算平台,重點解決目前以太坊存在的性能不足、資源不隔離、治理結構三方面的問題而誕生的。
④ 以太坊多節點私有鏈部署
假設兩台電腦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
⑤ 以太坊區塊鏈之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