在開始之前,要先了解智能合約的地址是怎麼產生的,大家都知錢包地址是通過助記詞生成私鑰,然後通過私鑰生成地址的,每個錢包地址都有一個唯一對應的私鑰,這個私鑰可以操控這個地址裡面所有的資產。那麼智能合約的地址是怎麼產生的呢:
智能合約地址的生成邏輯
合約地址是根據創建者(sender)的地址以及創建者發送過的交易數量(nonce)來計算確定的。 sender 和 nonce 進行 RLP 編碼,然後用 Keccak-256 進行 hash 計算。
def mk_contract_address(sender, nonce): return sha3(rlp.encode([normalize_address(sender), nonce]))[12:]
使用 Solidity 代碼:
// nonce 為 0 時生成的地址nonce0 = address(keccak256(0xd6, 0x94, address, 0x80))nonce1 = address(keccak256(0xd6, 0x94, address, 0x01))
通過上面的邏輯,我們知道了【智能合約的地址並不是通過私鑰來生成的】,也就是說這個地址的私鑰即使對於合約的創建者都沒有辦法知道,因為我們沒有辦法通過地址反向推導出私鑰。
用戶和智能合約交互
那麼用戶怎麼和智能合約進行交互呢?看下圖:
首先智能合約就是一段預先編寫好的程序,部署在區塊鏈上。雖然我們沒有私鑰去直接操作合約地址裡面的資產,但是可以通過合約程序定義的方法和合約進行互動,以【卡俄斯Chaos】智能合約為例,最核心的有三個方法:
兌換母幣:
張三通過往智能合約地址轉入TRX,智能合約通過預先制定的兌換比例返還一定數量的母幣給她,此時智能合約地址裡面就有了TRX資產,但是沒有任何人能直接將TRX資產通過私鑰轉移走,因為壓根兒就沒有私鑰。
質押挖礦:
李四用他兌換來的母幣質押進智能合約,一定時間過後,智能合約根據預先制定的規則就會挖出一定數量的子幣發送給李四,任何人沒有辦法直接獲取到子幣,當然收到的子幣可以到二級市場自由買賣。
兌現子幣:
王五將自己挖到的子幣發送到智能合約,智能合約根據預先定義的規則按照一定比例,將對應的TRX資產發送給王五。智能合約地址裡面的TRX資產除了這一種方法外,沒有其他任何途徑將TRX資產拿走。
如果保證智能合約裡面資金的安全
上面我們講到了,用戶如何和智能合約交互,也就是用戶調用智能合約的方法,從而實現TRX資金的進出。那麼有人會問,合約的創建者預先留一個套取TRX資金的合約方法,不就可以隨意拿取合約地址裡面的TRX資金了?事實上,是完全可以的。那麼怎麼保障所有參與智能合約者的利益呢?答案就是下面兩個途徑:
智能合約代碼審計
通過專業的第三方合約審計機構,進行代碼審計:
確保合約沒有留後門;確保項目邏輯和源碼一致;確保沒有安全漏洞,防範黑客攻擊;通過三方審計平臺查詢審計報告的詳細內容;智能合約代碼公開
在官方區塊鏈瀏覽器上完全公開智能合約的代碼:
確保項目宣傳和代碼邏輯一致;確保智能合約代碼人人可見,人人可以審計,沒有留後門,沒有安全漏洞。如果不信任三方審計的人,可以根據完全公開的源碼自己找值得信任的人或任何機構再次進行合約代碼審計;以下就是【卡俄斯Chaos】智能合約在官方區塊瀏覽器源碼驗證通過的截圖,確保源碼和正在運行的智能合約完全匹配。
智能合約在波場的完全代碼認證能過,合約是否完全開源就看是否有綠色
沒有就是假開源,同時,是所有業務邏輯源碼公開,還是只公開標準代幣源碼,區別也很大
本文來源: 金色財經 / 作者:未來新世界