Storage

乙太坊智能合約儲存

  • November 26, 2020

我目前正在創建我的第一個 dApp,但在理解乙太坊區塊鏈上的智能合約數據儲存時遇到了一些麻煩。我通過添加建構子更改了反應基本程式碼。如第一張圖片所示。現在,根據我的理解,在與智能合約互動時,每個公開的變數都將儲存在區塊鏈上。現在我嘗試在松露中測試它,但找不到有問題的值。交易的例子可以在圖片#2中找到。有人可以向我解釋一下數據實際儲存在區塊鏈上的哪個位置還是經過編碼的?

PS 我知道在區塊鏈上儲存大量數據是相當昂貴的。

程式碼和事務

圖 2 中的交易向您展示了已發送的交易。從字面上setValue(25)看,從/到,UID(交易雜湊),它被探勘的塊號等 - 但不是效果。你尋求的答案不存在。

在上面,你在哪裡app.getValue()得到了當時的價值。這就是您通過合約中的函式檢查合約狀態的方式。

讓你失望的是響應的格式。合約使用 256 位整數,而 JavaScript 沒有對應的類型。取而代之的是,使用 BigNumber.js 庫(匯總到 Web3 中)將您獲得的內容轉換為 BigNumber,該庫將有效數字組織在一種特殊類型的對像中並提供數學運算方法。

這是所有uint響應的情況。

你可以走了:

$ let x = await app.getValue()
$ x
BN: { <bigNumber object> }
$ x.toString(10)
`25`

這將列印 x 的值,一個 BigNumber 作為人類可讀的字元串,用 base-10 數字系統解釋它。

最佳實踐是習慣於以這種方式轉換所有“大數字”並使用 BigNumber 方法執行數學運算。這樣,您就不會失去任何精度。然後通過 UI 呈現人類可讀的格式。例如:

let x = await app.getValue();   // returns a BN
let y = web3.utils.toBN(`1`);   // cast `1` as a BN
let z = x.add(y);               // add two BN returns another BN
let zReadable = z.toString(10); // human-readable string, not recommended for math
console.log("The next number in the sequence is", zReadable); 

希望能幫助到你。

你應該跑

app.getValue().call()

引用自:https://ethereum.stackexchange.com/questions/90531