孟嘉霖 馬兆豐 王自亮 王真 高宏民



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