天天看點

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

本文目的:

1.搭建Ethereum私有鍊和節點叢集;

2.熟悉以太坊智能合約的部署和使用流程;

3.了解以太坊智能合約的應用和常見安全性問題;

參考:

https://www.jianshu.com/p/3aa80732ed73

https://blog.csdn.net/Jade0214/article/details/80043776

https://www.8btc.com/article/100840

Ethereum官網以及Ethereum Wallet下載下傳:

https://www.ethereum.org/

Solidity線上撰寫和編譯:

http://remix.ethereum.org/

Ethernaut智能合約安全演練:

https://ethernaut.zeppelin.solutions/

一、以太坊私有鍊搭建

參考:https://blog.csdn.net/sportshark/article/details/51855007

以太坊(英文Ethereum)是一個開源的有智能合約功能的公共區塊鍊平台,通過其專用加密貨币以太币(Ether)提供去中心化的虛拟機(“以太虛拟機” Ethereum Virtual Machine)來處理點對點合約。

區塊鍊1.0時代通常是指在2009年到2014年之間,以比特币為代表的區塊鍊應用發展階段,它們主要緻力于解決貨币和支付手段的去中心化問題;2014年之後,開發者們越來越注重于解決比特币在技術和擴充性方面的不足。2013年底,Vitalik Buterin(V神)釋出了以太坊白皮書《以太坊:下一代智能合約和去中心化應用平台》,将智能合約引入區塊鍊,打開了區塊鍊在貨币領域以外的應用,進而開啟了區塊鍊2.0時代。

截至2018年11月,以太坊是市值NO.2的加密貨币,僅次于比特币。

1.前言

我們先看看從比特币到以太坊,智能合約是如何演變的。注意下方智能合約的位置,這個位置表明上方的應用(APP)必須通過智能合約來實作對應區塊鍊網絡的功能。

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

那麼,我們看一個簡單的例子,就是A轉賬給B,在比特币和以太坊中大概都怎麼實作的:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約
以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

以太坊智能合約實作的方式貌似能看懂,比較易讀。

事實也是這樣的,智能合約使得區塊鍊的擴充性更強,且實作上更簡潔,進而讓以太坊發展成為目前最大的一個區塊鍊開發平台。

2.安裝geth

Go-ethereum用戶端通常被稱為Geth,它是個指令行界面,執行在Go上實作的完整以太坊節點。Geth得益于Go語言的多平台特性,支援在多個平台上使用(比如Windows、Linux、Mac)。Geth是以太坊協定的具體落地實作,通過Geth,你可以實作以太坊的各種功能,如賬戶的建立編輯删除,開啟挖礦,ether币的轉移,智能合約的部署和執行等等。是以,我們選擇 geth工具來進行開發。

geth安裝方式(linux):

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

或者(windows):

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

或者(mac):

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

檢查是否安裝成功:$ geth --help

如果輸出一些幫助指令,則安裝成功。

3.初始化區塊鍊

定義創世區塊

以太坊支援自定義創世區塊,要運作私有鍊,我們就需要定義自己的創世區塊,創世區塊資訊寫在一個json格式的配置檔案中。檔案内容如下:

{
    "nonce":"0x0000000000000042",
    "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "difficulty": "0x4000",
    "alloc": {},
    "coinbase":"0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x",
     "config":{  
      "chainId":15,  
      "homesteadBlock":0,  
      "eip155Block":0,  
      "eip158Block":0  
    },  
    "gasLimit":"0xffffffff"
}

           

啟動Geth即可以啟動以太坊的區塊鍊,為了建構私有鍊 ,需要在Geth啟動時加入一些參數,Geth參數含義如下:

identity–區塊鍊的标示,随便填寫,用于标示目前網絡的名字

init–指定創世塊檔案的位置,并建立初始塊

datadir–設定目前區塊鍊網絡資料存放的位置

port–網絡監聽端口

rpc–啟動rpc通信,可以進行智能合約的部署和調試

rpcapi–設定允許連接配接的rpc的用戶端,一般為db,eth,net,web3

networkid–設定目前區塊鍊的網絡ID,用于區分不同的網絡,是一個數字

console–啟動指令行模式,可以在Geth中執行指令

4.啟動私有鍊節點

接下來在windows啟動區塊鍊節點:

進入Windows下Geth的目錄 ,放置配置好的genesis.json檔案,執行如下指令:

geth --datadir “%cd%\chain” init genesis.json

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

geth --identity “PICCetherum” -rpc --rpccorsdomain “*” --datadir “%cd%\chain” --port “30303” --rpcapi “db,eth,net,web3” --networkid 95518 console

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

如圖說明啟動成功。

這是一個互動式的Javascript執行環境,在這裡面可以執行Javascript代碼,其中>是指令提示符。在這個環境裡也内置了一些用來操作以太坊的Javascript對象,可以直接使用這些對象。這些對象主要包括:

eth:包含一些跟操作區塊鍊相關的方法

net:包含以下檢視p2p網絡狀态的方法

admin:包含一些與管理節點相關的方法

miner:包含啟動&停止挖礦的一些方法

personal:主要包含一些管理賬戶的方法

txpool:包含一些檢視交易記憶體池的方法

web3:包含了以上對象,還包含一些機關換算的方法

初始化成功之後目錄如下:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

其中geth/chaindata中存放的是區塊資料,keystore中存放的是賬戶資料。

5.以太坊Javascript Console

進入以太坊Javascript Console後,就可以使用裡面的内置對象做一些操作,這些内置對象提供的功能很豐富,比如檢視區塊和交易、建立賬戶、挖礦、發送交易、部署智能合約等。接下來介紹幾個常用功能,下面的操作中,前面帶>的表示在Javascript Console中執行的指令。

使用節點建立賬号

啟動節點成功後,會進入Geth的指令行模式,輸入如下指令

personal.newAccount()

系統會提示你輸入密碼,并确認,最後會顯示一個新生成的賬号。

Passphrase其實就是密碼的意思,輸入兩次密碼後,就建立了一個賬戶。

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

再次執行指令:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

這時候用eth.accounts指令檢視,就會發現有兩個賬戶了:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

賬戶預設會儲存在資料目錄的keystore檔案夾中。檢視目錄結構,發現chain/keystore中多了兩個檔案,這兩個檔案就對應剛才建立的兩個賬戶,這是json格式的文本檔案,可以打開檢視,裡面存的是私鑰經過密碼加密後的資訊:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

每次記一長串的位址很麻煩,我們可以通過設定變量來表示賬戶:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

檢視賬戶餘額

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

啟動、停止挖礦

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

其中start的參數表示挖礦使用的線程數。第一次啟動挖礦會先生成挖礦所需的DAG檔案,這個過程有點慢,等進度達到100%後,就會開始挖礦,此時螢幕會被挖礦資訊刷屏:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

如果想停止挖礦,并且進度已經達到100%之後,可以在js console中輸入

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約
以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

挖到一個區塊會獎勵5個以太币,挖礦所得的獎勵會進入礦工的賬戶,這個賬戶叫做coinbase,預設情況下coinbase是本地賬戶中的第一個賬戶:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

和上文的第一個賬戶對比一下,是一緻的。

getBalance()傳回值的機關是wei,wei是以太币的最小機關,1個以太币=10的18次方個wei。要檢視有多少個以太币,可以用web3.fromWei()将傳回值換算成以太币:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

發送一筆交易

eth.sendTransaction({from:acc0,to:acc1,value:20})

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

這裡報錯了,原因是賬戶每隔一段時間就會被鎖住,要發送交易,必須先解鎖賬戶,由于我們要從賬戶0發送交易,是以要解鎖賬戶0:

personal.unlockAccount(acc0)

輸入建立賬戶時設定的密碼,就可以成功解鎖賬戶。

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

解鎖後後再發送交易。

我們去檢視賬戶1中的餘額,發現還沒轉過去,此時交易已經送出到區塊鍊,但還未被處理,這可以通過檢視txpool來驗證:

txpool.status

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

其中有一條pending的交易,pending表示已送出但還未被處理的交易。

要使交易被處理,必須要挖礦。這裡我們啟動挖礦,然後等待挖到一個區塊之後就停止挖礦:

miner.start(1);admin.sleepBlocks(1);miner.stop();

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

當miner.stop()傳回true後,txpool中pending的交易數量應該為0了,說明交易已經被處理了,而賬戶1應該收到币了:

web3.fromWei(eth.getBalance(acc1),‘ether’)

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

檢視交易

eth對象封裝了檢視交易和區塊資訊的方法。

檢視目前區塊總數:

eth.blockNumber

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

5.圖形界面Ethereum Wallet連接配接私有鍊

Ethereum Wallet是以太坊提供的官方應用,具備建立賬戶,轉移以太币,部署調用智能合約等功能。這裡我們可以用它連接配接到我們自己的私有鍊上,作為輔助工具更友善地進行私鍊操作。

二、建立節點叢集

在私有網絡中建立多個節點組成的叢集,并互相發現,産生交易。

如果是為了在本地網絡運作多個以太坊節點的執行個體,必須確定以下幾點:

  1. 每個執行個體都有獨立的資料目錄(–datadir)
  2. 每個執行個體運作都有獨立的端口.(eth和rpc兩者都是)(–port 和 --rpcprot)
  3. 在叢集的情況下, 執行個體之間都必須要知道彼此.
  4. 唯一的ipc通信端點,或者禁用ipc.

在這裡,我們選擇在不同的電腦上分别建立節點組成叢集,互相發現,産生交易。

在第一台電腦上啟動節點:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

在第二台電腦上初始化(使用相同的json檔案)并啟動節點,注意網絡ID要相同,確定節點都在一個私有網絡中:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

bootnodes後邊的參數是第一台電腦上節點的enode url ,包括ip和端口号等資訊,都可以在第一台電腦上通過如下指令來擷取:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

至此兩個節點應該就連結成功了。

節點間發送以太币:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

from中填目前節點的賬号位址,to中填要發送給的節點的賬号位址。

執行以上指令發送一個以太币。注意發送交易操作前要先解鎖賬号,然後執行挖礦才能讓交易生效。

三、在以太坊私有鍊上部署第一個智能合約

智能合約是一段代碼和資料的集合,可以部署以太坊網絡上運作。如果做比喻的話智能合約更像是JAVA程式,JAVA程式通過JAVA虛拟機(JVM)将代碼解釋位元組進行執行,以太坊的智能合約通過以太坊虛拟機(EVM)解釋成位元組碼進行執行,如果你學過彙編,會發現編譯後的位元組碼和彙編很類似。同時智能合約有自己的賬戶,在時間或事件的驅動下能自動執行一些功能,如可以在互相之間傳遞資訊,修改區塊鍊的狀态比如賬戶資訊等。以太坊的智能合約最大的特點是圖靈完備,通俗來說可以完全模拟一台計算機所能做的所有事情,大家熟知的比特币其實也可以執行一些簡單腳本,但是他就不是圖靈完備,比如循環指令比特币就無法執行。

本文的智能合約采用以太坊官方的示例合約,功能就是在區塊鍊上存儲一個數字,并能夠讀取出來。代碼如下:

pragma solidity ^0.4.0;
contract SimpleStorage{
	uint storedData;

	function set(uint x){
	storedData=x;
	}

	function get() constant returns (uint retVal){
		return storedData;
	}

}
           

即使沒有學過Solidity語言也可以大緻看出,該合約set函數存儲一個數字在X變量中,get函數從X變量中讀取這個數字出來,下面對這個合約進行部署。

在部署合約前,需要準備兩樣東西:

1.編譯後的代碼。

2.應用程式二進制接口(ABI),它是一個定義如何與合約進行互動的JavaScript對象。

我們可以通過使用Solidity編譯器來獲得這兩者。

線上編譯器remix的位址:http://remix.ethereum.org/#optimize=false&version=soljson-v0.4.25+commit.59dbf8f1.js

獲得編譯後的代碼

将源代碼複制到Remix,點選編譯。

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

要通路已編譯的代碼,直接點選菜單右邊的details按鈕。 在彈出視窗中,向下滾動并複制WEB3DEPLOY文本框中的所有代碼:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

可以将結果直接粘貼到geth視窗中,然後執行挖礦:

miner.start(1);admin.sleepBlocks(1);miner.stop();

等待一會終端中會看到這樣的消息:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

可能必須先使用你在開始時選擇的密碼來“解鎖”發送交易的帳戶,因為你需要支付部署合同的GAS費用。

可以使用以下指令來驗證已部署的代碼(将被編譯):

eth.getCode(simplestorage.address)

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

如果它傳回“0x”以外的任何内容,那麼恭喜,代碼已經被部署了。 如果再次建立合同(通過執行另一個eth.sendTransaction),它将釋出到新位址。

執行合約

隻需在終端上輸入以下指令:

simplestorage.get()

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

如果出現以下問題:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

請輸入:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

出現賬戶鎖定問題時解鎖賬戶即可。

讓其他節點與合約代碼互動

為了讓其他人來執行你的合同,他們需要兩個東西:

1.合同所在位址

2. ABI(應用程式二進制接口),這是一種使用者手冊,描述合同功能的名稱以及如何将它們調用到您的JavaScript控制台

想要擷取位址,請運作以下指令:

simplestorage.address

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

為了得到ABI,你需要直接從Remix複制ABI,類似于複制WEB3DEPLOY編譯代碼的方式。 在右側窗格中,單擊詳細資訊按鈕并向下滾動到ABI文本框。 點選複制按鈕複制整個ABI,然後将其粘貼到臨時文本中。

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

然後,你可以執行個體化一個可用于在連接配接到網絡的任何計算機上調用合同的JavaScript對象。 在以下行中,替換ABI(一個數組)和Address(一個字元串)以在JavaScript中建立合同對象:

var simplestorage = eth.contract(ABI).at(Address)

如下:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

這樣别的節點就也可以通過

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

來調用你的智能合約了。

當某個節點改變了合約中存儲的值,任一節點啟動挖礦确認交易之後,每個節點都可以再次通過調用函數看到改變後的新值。

四、攻擊一份智能合約

據相關統計,以太坊、EOS等平台上每日智能合約建立數量呈現上升趨勢,其管理的數字資産數量提升,面臨的威脅也随之增長。然而由于一般開發人員的安全意識不夠,可能在開發智能合約時無意留下了安全隐患,進而造成損失。并且智能合約難以通過傳統的更新、打更新檔等方式填補漏洞,每一個暴露在開放網絡上的智能合約都有可能成為專業黑客團隊的攻擊目标。

用例選自Ethernaut levels/04:

https://ethernaut.zeppelin.solutions/level/0x6b7b4a5260b67c1ee9196a42dd1ed8633231ba0a

以下是一個非常簡單的智能合約,可能已經被其他任何人部署,我們需要做的是改變這個合約的owner,使之成為自己的位址。

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

可以看到合約本身提供了changeOwner的方法,但是直接調用是行不通的,需要滿足if語句中的條件,相關參考:

https://bitshuo.com/topic/59afc169fbcd445a40a3e2e6

了解了原理,我們就可以寫一份攻擊合約:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

先看看此時合約的擁有者:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

部署并成功調用攻擊合約:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

之後,可以發現owner成功改變為自身位址:

以太坊私有鍊搭建,建立節點叢集,部署智能合約,攻擊智能合約一、以太坊私有鍊搭建二、建立節點叢集三、在以太坊私有鍊上部署第一個智能合約四、攻擊一份智能合約

更多關卡請檢視:

https://ethernaut.zeppelin.solutions/

實際上,在現有各大區塊鍊平台上,利用各種漏洞部署惡意合約代碼進行攻擊的手段屢見不鮮。區塊鍊具有的開放共識、去中心、去信任、匿名性、安全不可篡改、可追溯性等特點能夠為如何有效地保障資料安全提供一條解決問題的思路,但也帶來了很多新的安全問題,區塊鍊技術的成熟和完善正經曆着考驗。

繼續閱讀