智能合約訪問(wèn)區(qū)塊鏈數(shù)據(jù)的兩種方法介紹
作為在 TRON 協(xié)議上運(yùn)行的虛擬機(jī),TVM 需要能夠與區(qū)塊鏈上的數(shù)據(jù)進(jìn)行交互。 因此,它必須能夠幫助智能合約訪問(wèn)區(qū)塊鏈數(shù)據(jù)。
智能合約有兩種方法可以訪問(wèn)區(qū)塊鏈:
1. 區(qū)塊鏈數(shù)據(jù)(即賬戶數(shù)據(jù),投票數(shù)據(jù),代幣發(fā)行等)
2. 智能合約數(shù)據(jù):存儲(chǔ)
訪問(wèn)鏈上的數(shù)據(jù)
在 TVM 運(yùn)行期間,通常會(huì)查詢鏈數(shù)據(jù),例如帳戶數(shù)據(jù)和代幣發(fā)布數(shù)據(jù)。 在 TRON 的開(kāi)發(fā)過(guò)程中,為了防止定期查詢硬盤(pán)上的鏈,每個(gè)智能合約啟動(dòng)都會(huì)創(chuàng)建一個(gè)相關(guān)的區(qū)塊鏈數(shù)據(jù)緩存。 對(duì)于每個(gè)智能合約,相同的密鑰只能使用兩次來(lái)訪問(wèn) LevelDB,一次用于第一次讀取,再次用于新數(shù)據(jù)(包括刪除密鑰)。
存儲(chǔ)
存儲(chǔ)用于保持智能合約狀態(tài)。 每份合約都使用自己的 Solidity 存儲(chǔ)。 在 Solidity 中,訪問(wèn)存儲(chǔ)數(shù)據(jù)的主要命令是 SLOAD 和 STORE。
存儲(chǔ)中的數(shù)據(jù)是多個(gè)鍵值對(duì),包括存儲(chǔ)密鑰和存儲(chǔ)值,鍵值對(duì)是一個(gè)字(32 字節(jié)的實(shí)體)。
在 Solidity 中,不同的數(shù)據(jù)類型具有用于確定其結(jié)構(gòu)相應(yīng)的規(guī)則,因?yàn)檫@在稱為 文檔。 Solidity 決定了 Storage Key 的邏輯結(jié)構(gòu)。 對(duì)于不同的合同,可能會(huì)出現(xiàn)相同的存儲(chǔ)密鑰,因此存儲(chǔ)不能直接存儲(chǔ)在其邏輯結(jié)構(gòu)中的現(xiàn)有數(shù)據(jù)庫(kù)(LevelDB)中。 為了更有效地與鏈結(jié)合,必須相應(yīng)地設(shè)計(jì)鏈上的物理存儲(chǔ)。
由于智能合約中的存儲(chǔ)訪問(wèn)通常只是存儲(chǔ)密鑰的一部分,因此最好通過(guò)按需訪問(wèn)加載存儲(chǔ),而不是每次都將所有存儲(chǔ)加載到內(nèi)存中。 因此,每個(gè)合同中的存儲(chǔ)密鑰需要全局唯一才能將其存儲(chǔ)在同一數(shù)據(jù)庫(kù)中。
存儲(chǔ)密鑰的邏輯結(jié)構(gòu)確定后續(xù)的16個(gè)字節(jié),以確保同一合同中存儲(chǔ)密鑰的唯一性。 因此,您可以使用合約地址的哈希值和存儲(chǔ)密鑰的最后16個(gè)字節(jié)來(lái)形成全局唯一鍵。 組成邏輯如下: