Solidity
如何在區塊鏈中驗證和跟踪智能合約中的每筆新交易?
我已經閱讀了所有其他類似的問題,但似乎無法牢牢掌握這個概念。由於其他文章的幫助,我理解了這個過程中的一些步驟,有些我完全錯過了。
我將在下面舉例說明我的理解,並隨時糾正我並為我模糊的部分提供答案。
根據我的理解:
- 在乙太坊中創建智能合約時,智能合約的字節碼在交易中發布(在一個區塊中開採),我為此支付了汽油費(到目前為止還不錯),然後儲存在網路的儲存中**(那個儲存是什麼?它在哪裡?它是每個節點的本地機器嗎?)**與地址相關聯。
假設我已經在下面實現了這個簡單的智能合約(我在 stackoverflow 上找到了它),我在其中創建了一個籌款活動,我想籌集特定數量的資金,然後在達到限制時撤回它們:
pragma solidity ^0.8; contract MyContract { uint256 constant FUNDING_GOAL = 1 ether; address constant TEAM_ADDRESS = address(0x123); /** * Throws if the current balance is lower than the goal * Otherwise sends all of the current balance to the predefined address * */ function withdraw() external { require(address(this).balance >= FUNDING_GOAL, 'Haven\'t reached the funding goal'); payable(TEAM_ADDRESS).transfer(address(this).balance); } /** * Allows this contract to receive native currency of the network (usually ETH or BNB) */ receive() external payable {} }
現在我已經創建了這個契約,它通過我在步驟 1中所述的過程進行了驗證。到目前為止,一切都很好。
- 現在我想區塊鏈中的每個人都可以看到 TEAM_ADDRESS 並且可以通過在他們身邊簽署契約並在上面存入特定金額來相應地向我匯款?當這種情況發生時,這個簽名過程會再次包含在一個塊中,因為一個新的交易引用了我的智能合約的地址並且智能合約的內部變數正在更新?
- 因此,通過將智能合約“保存”在所有節點都可以訪問的儲存空間中,然後每次訪問該儲存空間以驗證從中產生的任何新交易,可以確保合約的狀態?
我非常努力地在這個新概念中盡可能清晰地表達我的思維過程。我希望我寫的內容對您有意義,並且社區可以指導我找到正確的答案。
提前致謝。
- 所以是的,儲存存在於所有節點的本地記憶體中,也存在於鏈數據中的任何人。每當生成一個新塊時,所有節點都會添加更新其儲存資訊以匹配該塊中所有事務的更改。
- 是的,合約的新交易將被包含在一個區塊中並相應地更新儲存,無論是關於代幣轉移、eth 轉移或內部契約變數的資訊。所有這些都被認為是“國家”的一部分。
- 任何試圖以不遵循協議規則的方式更新儲存的塊的任何節點都不會讓其他節點接受其塊,其他節點會在生成塊時驗證對該狀態的所有更新以確定是否他們認為它是有效的。大多數節點接受的塊實際上將被添加到區塊鏈中,並相應地更新儲存。這可以阻止任何節點僅僅修改其節點中的儲存來弄亂合約的內部變數。本質上是去中心化驗證,需要 51% 的節點串通才能惡意更改狀態,即使這樣也會被認為不符合協議,使用者可能會認為該分叉完全無效。