孟嘉霖 馬兆豐 王自亮 王真 高宏民
摘?? 要:區(qū)塊鏈具有去中心化、全局賬本、不可篡改和安全可信等特點,在數(shù)字資產(chǎn)發(fā)行和管理方面都具有極為獨特的優(yōu)勢和特點。文章提出了基于以太坊區(qū)塊鏈技術(shù)的數(shù)字資產(chǎn)發(fā)行及管理方法,設(shè)計實現(xiàn)了以太坊錢包為核心的關(guān)鍵技術(shù),并基于ERC20實現(xiàn)了數(shù)字資產(chǎn)發(fā)行及資產(chǎn)管理的智能合約,通過上層應(yīng)用調(diào)用智能合約實現(xiàn)了數(shù)字資產(chǎn)轉(zhuǎn)賬、分段鎖倉及銷毀等一系列的關(guān)鍵功能。最后,從賬戶安全和合約安全兩個方面,全面分析了實現(xiàn)賬戶和智能合約的安全性,分析表明了文章所實現(xiàn)的以太坊數(shù)字資產(chǎn)發(fā)行及管理系統(tǒng)具有良好的功能和安全性能,能滿足數(shù)字資產(chǎn)的安全發(fā)行和管理技術(shù)要求,可為基于以太坊區(qū)塊鏈的數(shù)字資產(chǎn)發(fā)行提供了一個通用應(yīng)用實現(xiàn)。
關(guān)鍵詞:區(qū)塊鏈;以太坊;智能合約;數(shù)字資產(chǎn)發(fā)行及管理;安全性
中圖分類號:TP311;TP393????????? 文獻(xiàn)標(biāo)識碼:A
Blockchain-based implementation of secure issuance and management technology of digital assets
Meng Jialin? Ma Zhaofeng? Wang Ziliang? Wang Zhen? Gao Hongming
(1. The School of Cyberspace Security, Beijing University of Posts and Telecommunications, Beijing 100876;
2. Joint Laboratory of blockchain and security technology, Beijing University of Posts and Telecommunications, Beijing 100876;
3. China Mobile Communications Group, Shandong Co., Ltd, ShandongJinan 250001)
Abstract: Blockchain has the characteristics of decentralization, global ledger, non tampering, security and credibility, and has unique advantages and characteristics in the issuance and management of digital assets. This paper puts forward the method of digital asset issuance and management based on Ethereum blockchain technology, designs and realizes the core key technology of Ethereum wallet, and realizes the smart contract of digital asset issuance and asset management based on erc20. Through the upper application, the smart contract is called to realize a series of key functions, such as digital asset transfer, phased locking and destruction. Finally, from two aspects of account security and contract security, comprehensive analysis of the implementation security of accounts and smart contract. The analysis shows that the Ethereum digital asset distribution and management system implemented in this paper has good function and security performance, can meet the technical requirements of digital asset security distribution and management, and can provide a general application implementation for digital asset distribution based on Ethereum blockchain.
Key words: blockchain; ethereum; smart contract; digital asset issuance and management; security
1 引言
隨著科技的進(jìn)步,互聯(lián)網(wǎng)讓人們的生活和工作變得更加便利、高效,同時數(shù)字資產(chǎn)也得到了很大的發(fā)展?,F(xiàn)有的數(shù)字資產(chǎn)交易技術(shù)是把數(shù)據(jù)信息存儲在一個中心化數(shù)據(jù)庫中,因此很容易出現(xiàn)安全漏洞。
數(shù)字資產(chǎn)(Digital assets)是指個人或企業(yè)擁有或控制,以電子數(shù)據(jù)的形式存在,在日?;顒又谐钟幸詡涑鍪刍蛱幱谏a(chǎn)過程中的非貨幣性資產(chǎn)。數(shù)字資產(chǎn)具有強(qiáng)烈的金融屬性,一直以來都備受大眾和政府部門的重視和監(jiān)督[1],數(shù)字資產(chǎn)一旦發(fā)生漏洞將會造成不可逆轉(zhuǎn)的甚至災(zāi)難性的影響。因此營造安全、可靠的數(shù)字資產(chǎn)交易環(huán)境就顯得尤為重要。
2008年,中本聰(Satoshi Nakamoto)發(fā)表了《比特幣:一種點對點的電子現(xiàn)金系統(tǒng)》一文[2],從此奠定了區(qū)塊鏈技術(shù)和加密數(shù)字貨幣發(fā)明的基礎(chǔ)。區(qū)塊鏈技術(shù)具有去中心化、不易篡改和驗證節(jié)點共同維護(hù)等特點,為數(shù)字資產(chǎn)創(chuàng)造了新的安全模式下的管理方式。隨著區(qū)塊鏈技術(shù)的不斷發(fā)展,越來越多的人對區(qū)塊鏈進(jìn)行開發(fā)和研究,但這同時也暴露了區(qū)塊鏈技術(shù)存在的弊端。2018損失六十億的美鏈漏洞為全世界區(qū)塊鏈的安全問題敲響了警鐘。因此,采用合理的通用化技術(shù)來支撐基于區(qū)塊鏈的數(shù)字資產(chǎn)有極其重要的意義。
2 以太坊區(qū)塊鏈體系架構(gòu)
以太坊(Ethereum)是一個開源的有智能合約功能的公共區(qū)塊鏈平臺,通過其專用加密貨幣以太幣(Ether,簡稱“ETH”)提供的去中心化以太坊虛擬機(jī)EVM(Ethereum Virtual Machine)來處理點對點合約。
以太坊的架構(gòu)可大致分為兩層,分別是應(yīng)用層和基礎(chǔ)設(shè)施層,如圖1所示。
應(yīng)用層有DApp(Decentralized Application,分布式應(yīng)用)和以太坊錢包等多種衍生應(yīng)用,是目前開發(fā)者最為活躍的一層。
基礎(chǔ)設(shè)施層包含了區(qū)塊鏈的基礎(chǔ)功能如賬戶管理、區(qū)塊鏈管理、智能合約等。它為訪問應(yīng)用層提供了接口,封裝了區(qū)塊鏈的操作細(xì)節(jié)。其中,智能合約運(yùn)行在以太坊虛擬機(jī)EVM中。智能合約系統(tǒng)將合約代碼化,由特定的事件驅(qū)動觸發(fā)執(zhí)行。以太坊系統(tǒng)中有PoW和PoS兩種共識算法。HTTP、RPC、Whipser等協(xié)議為以太坊提供供系統(tǒng)各模塊相互調(diào)用的協(xié)議支持。
2.1 以太坊數(shù)字簽名算法
以太坊的數(shù)字簽名算法采用的是橢圓曲線數(shù)字簽名算法(ECDSA),它是利用橢圓曲線加密技術(shù)進(jìn)行的數(shù)字簽名方法。假設(shè)發(fā)送者需要發(fā)送消息給接收者,首先需要定義橢圓曲線加密所用的參數(shù),將這組參數(shù)表示為()。其中,CURVE表示橢圓曲線點域和幾何方程,G是所有點倍積運(yùn)算的基點,n是該橢圓曲線的可倍積階數(shù),且。
其次發(fā)送者要創(chuàng)建一個密鑰對,即一個私鑰和一個公鑰。私鑰是()范圍內(nèi)一個隨機(jī)數(shù):(公式)(1)
公鑰是私鑰和基點的橢圓曲線點倍積:(公式)(2)
2.1.1 簽名算法
簽名方對消息m簽名,具體步驟為:
(1)計算(公式)
(2)計算z,來自二進(jìn)制e的最高位(最左邊)L_n個bits,而L_n是上述橢圓曲線參數(shù)中的可倍積階數(shù)n的二進(jìn)制長度;
(3)從內(nèi)()內(nèi),隨機(jī)選擇一個整數(shù)k;
(4)計算一個橢圓曲線上點:(公式)(3)
(5)計算r值,如果()則返回步驟3重新計算;(公式)(4)
(6)計算s值,如果(),則返回步驟3重新計算;(公式)(5)
(7)生成的 就是數(shù)字簽名。
2.1.2 驗證算法
接收方的驗證分為兩部分,首先進(jìn)行公鑰的驗證,其次驗證簽名文件。
(1)公鑰的驗證
1)公鑰的坐標(biāo)應(yīng)是有效地,不會等于一個極限值空點;
2)驗證是位于該橢圓曲線上的點;
3)曲線的可倍積階數(shù)n與公鑰的點倍積不存在;
(6)
(2)簽名文件的驗證
1)驗證 r 和 s 均處于范圍內(nèi);
2)計算;
3)計算 z,來自e的最高位L_n個bits;
4)計算參數(shù) w
(7)
5)計算參數(shù)u1和u2
(8)
6)計算(x1,y1),如果(x1,y1)不是橢圓曲線上的點,則驗證失敗;
(9)
7)如果以下恒等式不成立,則驗證失敗。
(10)
2.2 以太坊共識機(jī)制
工作量證明機(jī)制PoW(Proof of Work)是以太坊目前的共識機(jī)制,PoW是對算力的證明,是產(chǎn)生新區(qū)塊時必須滿足的要求。在以太坊網(wǎng)絡(luò)中,節(jié)點通過計算隨機(jī)的哈希值來爭奪記賬權(quán),求得正確解的能力既是節(jié)點算力的體現(xiàn)。PoW機(jī)制要求每個節(jié)點基于自身算力去求解SHA256計算難題,即尋找一個隨機(jī)數(shù)Nonce,使得區(qū)塊頭部元數(shù)據(jù)的SHA256哈希值小于區(qū)塊頭中設(shè)定的目標(biāo)難度[3]:
(11)
其中,H為SHA256哈希函數(shù);n為隨機(jī)數(shù)Nonce;h為區(qū)塊頭部數(shù)據(jù);t為目標(biāo)難度最先求得正確解的節(jié)點即算力最強(qiáng)的節(jié)點,即可獲得新區(qū)塊的記賬權(quán)。
工作量證明機(jī)制的主要特性是計算的不對稱性,即工作方需要消耗大量的算力來得到一個結(jié)果,而驗證方卻很容易通過結(jié)果來驗證其準(zhǔn)確性。
2.3 以太坊智能合約
20 世紀(jì)末,Nick Szabo將智能合約定義為:“一個智能合約是一套以數(shù)字形式定義的承諾,包括合約參與方可以在上面執(zhí)行這些承諾的協(xié)議?!盵4] 智能合約一旦部署成功便不可再更改。
智能合約為數(shù)字資產(chǎn)提供了一種基礎(chǔ)協(xié)議,使得所有加入到這個區(qū)塊鏈的網(wǎng)絡(luò)節(jié)點都被強(qiáng)制遵守此協(xié)議,因此可以有序的執(zhí)行智能合約的規(guī)定從而完成數(shù)字資產(chǎn)的確權(quán)。
2.3.1 P2P網(wǎng)絡(luò)
以太坊采用全分布式結(jié)構(gòu)化的P2P網(wǎng)絡(luò),主要采用了Kademlia(簡稱Kad)算法實現(xiàn),Kad是一種分布式哈希表(Distributed Hash Table, DHT)技術(shù)。在Kad網(wǎng)絡(luò)中,各節(jié)點通過哈希算法散列為256位ID,任何接入P2P網(wǎng)絡(luò)的節(jié)點都具有唯一的一個節(jié)點ID。
2.3.2 EVM以太坊虛擬機(jī)
EVM本質(zhì)上是一個堆棧機(jī)器,它最直接的功能是執(zhí)行智能合約。以太坊通過EVM支持智能合約的調(diào)用和執(zhí)行,調(diào)用時根據(jù)合約地址獲取代碼,生成具體的執(zhí)行環(huán)境,然后將代碼加載到EVM虛擬機(jī)中運(yùn)行。目前,開發(fā)智能合約最常用的高級語言為solidity[5],在使用solidity實現(xiàn)智能合約邏輯后,通過編譯器編譯成元數(shù)據(jù),最后發(fā)布到以太坊上。
2.4 以太坊數(shù)據(jù)結(jié)構(gòu)
2.4.1 Merkle樹
Merkle樹是一種哈希二叉樹,它是一種用作快速歸納和校驗大規(guī)模數(shù)據(jù)完整性的數(shù)據(jù)結(jié)構(gòu)。Merkle樹的葉子節(jié)點代表區(qū)塊的各個交易,每個葉子節(jié)點都有一個哈希值。
2.4.2 以太坊區(qū)塊結(jié)構(gòu)
以太坊的區(qū)塊由一個包含元數(shù)據(jù)的區(qū)塊頭(Block Header)和緊跟其后構(gòu)成區(qū)塊主體(Block)的一長串交易組成。
以太坊區(qū)塊鏈中每個區(qū)塊頭都包含指向三個樹的指針:狀態(tài)樹(Root)、交易(TxHash)、收據(jù)樹(ReceiptHash)。狀態(tài)樹是系統(tǒng)狀態(tài)的哈希值。系統(tǒng)狀態(tài)是跨塊存在的,交易數(shù)和收據(jù)樹只存儲本區(qū)塊的交易和收據(jù)。以太坊區(qū)塊頭的結(jié)構(gòu)如表1所示,以太坊的區(qū)塊鏈的結(jié)構(gòu)如圖2所示。
3 以太坊數(shù)字資產(chǎn)發(fā)行及管理技術(shù)
3.1 ERC體系結(jié)構(gòu)
ERC(Ethereum Request for Comment)即以太坊通用征求意見協(xié)議。ERC是用來處理以太坊網(wǎng)絡(luò)成員提出的請求和對請求的采納,ERC為開發(fā)者提供了技術(shù)的指導(dǎo),也對以太坊網(wǎng)絡(luò)的發(fā)展提供了建議。
開發(fā)者可以通過提交EIP(Ethereum Improvement Proposal,以太坊改進(jìn)建議), 向以太坊社區(qū)提交新的ERC標(biāo)準(zhǔn)提案。提交內(nèi)容包括協(xié)議規(guī)范和合約標(biāo)準(zhǔn)。
3.1.1 ERC20
ERC20旨在為以太坊上的token合約提供一個特征與接口的共同標(biāo)準(zhǔn),讓開發(fā)人員可以對新代幣在以太坊生態(tài)系統(tǒng)中的作用進(jìn)行編程。ERC20標(biāo)準(zhǔn)[6]如表2所示。
3.2 賬戶管理
以太坊的全局“共享狀態(tài)”是由多個賬戶來組成的,這些賬戶可以通過消息傳遞架構(gòu)來與其他賬戶進(jìn)行交互。每個賬戶都有一個與之關(guān)聯(lián)的狀態(tài)和一個20字節(jié)的地址。以太坊的地址是一個160位的標(biāo)識符,用于識別帳戶。
以太坊有兩種類型的賬戶。
(1)外部賬戶:外部賬戶沒有代碼,可以通過創(chuàng)建和簽名一筆交易,從一個外部賬戶發(fā)送消息。
(2)合約賬戶:合約賬戶不能自行發(fā)起新的交易,合約帳戶只能觸發(fā)交易以響應(yīng)其他的交易。每當(dāng)合約賬戶收到一條消息時,合約內(nèi)部的代碼就會被激活,允許它對內(nèi)部存儲進(jìn)行讀取、寫入和發(fā)送其它消息或者創(chuàng)建合約。
3.2.1 公鑰、私鑰及地址
公鑰(Public Key)與私鑰(Private Key)是通過算法得到的一個密鑰對,公鑰是密鑰對外公開的部分,任何人都可以獲得,私鑰則只有用戶自己可以擁有,一旦泄露就會存在安全隱患。公鑰通常用于加密會話密鑰驗證數(shù)字簽名,或者加密只能用于對應(yīng)的私鑰解密的數(shù)據(jù)。
私鑰是一組64位的16進(jìn)制字符,通過私鑰可以訪問一個賬戶。以太坊的私鑰是通
過橢圓曲線算法secp256k1曲線生成的。
公鑰是由私鑰通過 secp256k1曲線轉(zhuǎn)化為的65字節(jié)非壓縮格式。公鑰進(jìn)行Keccak-256哈希運(yùn)算,取最后的40位16進(jìn)制字符串,開頭添加0x即生成了地址(Address)。
3.2.2 助記詞和Keystore文件
在創(chuàng)建錢包的過程中會生成一個助記詞,助記詞一般由12個單詞構(gòu)成,2個單詞之間由1個空格隔開,這些單詞都來源于一個固定的詞庫,是由私鑰經(jīng)過一定算法得到的,所以私鑰與助記詞之間可以相互推導(dǎo)轉(zhuǎn)化。助記詞是私鑰的另一種形式,其功能等同于私鑰。
Keystore文件是以太坊賬戶獨有的,用于簽署交易的以太坊私鑰的加密文件,是以太坊賬戶的一種表現(xiàn)形式。它包含了以太坊賬戶的地址,賬戶密文的私鑰和MAC地址等一系列的信息。
3.2.3 錢包的實現(xiàn)
錢包的本質(zhì)是一個私鑰,它是一個隨機(jī)
的哈希值字符串,擁有了私鑰就擁有了該錢包的使用權(quán)。
以太坊錢包的實現(xiàn)原理可以簡要概括為錢包助記詞生成的種子(Seed),種子生成私鑰,私鑰通過加密算法得到公鑰,公鑰經(jīng)過哈希運(yùn)算得到錢包地址。通過助記詞生成錢包,同時顯示其地址、私鑰以及衍生路徑。
錢包實現(xiàn)的關(guān)鍵代碼如表3所示。
通過私鑰或助記詞可以恢復(fù)錢包,獲得錢包地址,實現(xiàn)關(guān)鍵代碼如表4所示。3.3 基于ECR20數(shù)字資產(chǎn)的安全發(fā)行及管理
本文實現(xiàn)了基于ERC20技術(shù)標(biāo)準(zhǔn)的數(shù)字資產(chǎn)管理系統(tǒng),該系統(tǒng)實現(xiàn)了數(shù)字資產(chǎn)的發(fā)行、數(shù)字資產(chǎn)的分配、數(shù)字資產(chǎn)的轉(zhuǎn)賬及分段鎖倉等功能。系統(tǒng)界面如圖3所示。
3.3.1 轉(zhuǎn)賬的實現(xiàn)
在以太坊轉(zhuǎn)賬有三個核心步驟。
(1) 交易創(chuàng)建。用交易發(fā)起者的私鑰對交易進(jìn)行簽名,廣播到網(wǎng)絡(luò)之后所有節(jié)點都可以用交易發(fā)起者的公鑰進(jìn)行驗證。
(2)交易驗證。對簽名進(jìn)行廣播并驗證。由網(wǎng)絡(luò)中的節(jié)點進(jìn)行驗證工作。驗證通過后交易進(jìn)入交易池并等待打包。
(3) 交易記錄。礦工打包交易并生成新的區(qū)塊。礦工打包交易時優(yōu)先選擇礦工費高、占用內(nèi)存小的交易。當(dāng)?shù)V工挖礦成功時,會向全網(wǎng)廣播該區(qū)塊,通過網(wǎng)絡(luò)中其他節(jié)點的驗證后,該區(qū)塊加到區(qū)塊鏈上,開始下一輪的挖礦。
轉(zhuǎn)賬實現(xiàn)關(guān)鍵代碼如表5所示。
3.3.2 分段鎖倉的實現(xiàn)
數(shù)字資產(chǎn)的鎖倉是指將代幣進(jìn)行一定期限的鎖定,鎖定的代幣不允許在市場上流通交易,到期時才能解鎖買賣。
分段鎖倉是指將資產(chǎn)先預(yù)分發(fā)給某一賬戶,但是此時資產(chǎn)是凍結(jié)的狀態(tài),無法進(jìn)行交易。合約在一段時間之后逐漸釋放資產(chǎn),可以分階段完成,例如第一階段釋放40%的資產(chǎn),第二階段釋放30%,最后釋放30%。
分段鎖倉實現(xiàn)關(guān)鍵代碼如表6所示。
鎖倉的優(yōu)點是鎖倉降低了代幣的流動性,增加了用戶的黏性,人為地打破了原有的供需關(guān)系,代幣數(shù)量變少,價格自然上漲,同時鎖倉到期還能夠得到相應(yīng)的利息和獎勵。
3.3.3 資產(chǎn)銷毀的實現(xiàn)
資產(chǎn)的銷毀是為了滿足管理的需求,將賬戶的總資產(chǎn)進(jìn)行定量銷毀。
銷毀資產(chǎn)實現(xiàn)關(guān)鍵代碼如表7所示。
4 以太坊安全風(fēng)險分析
4.1 賬戶安全風(fēng)險分析
在區(qū)塊鏈中,擁有了賬戶的密鑰就相當(dāng)于擁有了賬戶的使用權(quán),密鑰直接關(guān)系到賬戶的安全, 因此密鑰也極容易成為攻擊者的攻擊目標(biāo)。用戶存儲和使用不當(dāng)而導(dǎo)致密鑰泄露會給用戶帶來極大的經(jīng)濟(jì)損失。區(qū)塊鏈的不可篡改性也使得密鑰一旦丟失或被盜,用戶將遭受不可逆轉(zhuǎn)的損失。
在以太坊中有離線存儲、本地存儲和托管錢包等幾種常見的密鑰管理方法。其中,離線存儲將密鑰保存在離線的物理存儲介質(zhì)如u盤中并將之與網(wǎng)絡(luò)隔離,防止網(wǎng)絡(luò)攻擊。本地存儲是將密鑰直接或者加密后存儲在本地的設(shè)備上。托管錢包是通過第三方服務(wù)器為用戶提供密鑰保管服務(wù)[7]。
4.2 智能合約安全風(fēng)險分析
4.2.1 短地址攻擊
短地址攻擊是針對基于ERC20標(biāo)準(zhǔn)的token 轉(zhuǎn)賬時產(chǎn)生的問題。在調(diào)用transfer方法時,實際發(fā)送交易的是abi編碼后的16進(jìn)制代碼,其中每個參數(shù)長度是固定的,如果長度不足會自動補(bǔ)0。
當(dāng)調(diào)用transfer函數(shù)進(jìn)行轉(zhuǎn)賬時,交易的輸入數(shù)據(jù)分為三個部分,將三部分整合在一起就是交易數(shù)據(jù)。
(1) 4 字節(jié),方法的哈希值(hash):a901237b
(2)32字節(jié),以太坊地址(address),高位補(bǔ)0:000000000000000000000000acd11956de450986109372cade7d8c02ac5be8a0
(3) 32字節(jié),轉(zhuǎn)移的代幣數(shù)量(amount):
0000000000000000000000000000000000000000000000000000000000000010
漏洞源于此,如果address的最后是以0結(jié)尾的,而攻擊者少輸入最后的0,amount編碼高位補(bǔ)0,導(dǎo)致amount編譯值比實際輸入值大。從而實現(xiàn)轉(zhuǎn)移超出實際應(yīng)該transfer的數(shù)量的token。
當(dāng)調(diào)用transfer方法時,傳入的參數(shù)為:
0x87a22ca9
0000000000000000000000008a52c6425de450986109372cade7d8c02ac5be8a0
0000000000000000000000000000000000000000000000000000000000000002
若輸入時不慎漏掉了以太坊賬戶地址最后的“a0”,輸入?yún)?shù)就變成了:
0x87a22ca9
0000000000000000000000008a52c6425de450986109372cade7d8c02ac5be800
00000000000000000000000000000000000000000000000000000000000002
由于address字段缺失1個字節(jié),EVM會把a(bǔ)mount高位的一個字節(jié)的0填充到地址部分,這樣使得amount左移1個字節(jié),即向左移位8,此時amount就成了512,遠(yuǎn)大于用戶原本輸入的轉(zhuǎn)賬金額,會造成大量的損失。
規(guī)避地址漏洞的最有效地方法是在ERC20合約中執(zhí)行輸入?yún)?shù)的驗證。
4.2.2 重入攻擊(DAO)
在以太坊中智能合約中進(jìn)行轉(zhuǎn)賬操作,一旦向被攻擊者劫持的合約地址發(fā)起轉(zhuǎn)賬交易,迫使執(zhí)行攻擊合約的回調(diào)函數(shù),回調(diào)函數(shù)中包含回調(diào)自身代碼,將會導(dǎo)致代碼“重新進(jìn)入”合約。這種合約漏洞被稱為“重入漏洞”。
以太坊中向合約調(diào)用send、transfer、call函數(shù)時都會調(diào)用回調(diào)函數(shù),其中send和transfer每次傳遞給回調(diào)的函數(shù)只有2300 gas,此gas只能用于日志的記錄,因為其他操作都將超過2300 gas。但是call則會把剩余的所有 gas 都傳給回調(diào)函數(shù),這有可能導(dǎo)致循環(huán)調(diào)用。
帶有重入漏洞的合約代碼如表8所示。
call.value()函數(shù)可以導(dǎo)致合約外部的代碼執(zhí)行。如果是由另一個合約進(jìn)行訪問,這就意味著此合約的回調(diào)函數(shù)被執(zhí)行了,將會在余額設(shè)置為0之前,再次遞歸調(diào)用withdraw(),從而獲得比現(xiàn)有余額更多的資金。
避免重入攻擊有效方法有三種[8]。
(1)在轉(zhuǎn)賬給外部合約時使用transfer或者send函數(shù),并使用require檢測結(jié)果。
(2)在轉(zhuǎn)賬前對金額進(jìn)行算術(shù)處理。
(3)引入互斥鎖。也就是說要添加一個在代碼執(zhí)行過程中鎖定合約的狀態(tài)變量,阻止重入調(diào)用。
修改后的合約代碼如表9所示。
5 結(jié)束語
以太坊的出現(xiàn)引領(lǐng)了區(qū)塊鏈2.0時代的到來,在以太坊蓬勃發(fā)展的同時,理清以太坊的基本原理以及其可能存在的安全問題顯得尤為重要。本文對以太坊的體系架構(gòu)、ERC技術(shù)標(biāo)準(zhǔn)和以太坊賬戶等進(jìn)行了詳細(xì)的分析。實現(xiàn)了以太坊錢包和基于ERC20標(biāo)準(zhǔn)的數(shù)字資產(chǎn)的轉(zhuǎn)賬、分段鎖倉和銷毀。
最后從以太坊賬戶安全和智能合約安全兩個方面分析了以太坊的安全風(fēng)險問題,有利于規(guī)避漏洞,營造更安全的以太坊開發(fā)環(huán)境。分析表明了本文所實現(xiàn)的以太坊數(shù)字資產(chǎn)發(fā)行及管理系統(tǒng)具有良好的功能和安全性能,能滿足同質(zhì)數(shù)字資產(chǎn)的安全發(fā)行和管理技術(shù)要求,可為基于以太坊區(qū)塊鏈的數(shù)字資產(chǎn)發(fā)行提供了一個通用應(yīng)用的實現(xiàn)。
參考文獻(xiàn)
[1] ?劉宗媛.中國區(qū)塊鏈政策環(huán)境回顧、分析與展望[J].網(wǎng)絡(luò)空間安全,2019,10(04):111-117.