Solidity

智能合約儲存

  • September 6, 2018

我正要創建我的第一個智能合約,但遇到了以下問題:

  1. 合約程式碼的確切儲存位置,我讀到它儲存在區塊鏈中,這是否意味著每個擁有完整區塊鏈實例的節點也都有合約程式碼?
  2. 礦工是否應該為了探勘一個新區塊首先執行所有合約呼叫並設置值,然後開始尋找 POW 難題解決和隨機值,如果是這樣,那麼我們可以擁有像比特幣這樣的乙太坊 ASIC 礦工,因為他們可以只做一項特定的工作,但每次執行契約程式碼都不同?
  3. 當礦工想要驗證具有合約呼叫的交易時,它應該執行合約程式碼嗎?如果是這樣,這是否意味著每個合約都可以執行多次,直到最終一個礦工找到正確的 nonce 並解決 pow 難題?如果這是真的,這意味著合約程式碼會不必要地執行多次?
  4. 合約變數的值儲存在哪裡,我的意思是,如果我們有一個可靠映射,它可以包含很多鍵值,那麼這個鍵值儲存在哪裡?如果它們儲存在區塊鏈中,那麼它們應該儲存在具有區塊鏈副本的每個節點中,這意味著大量數據會一遍又一遍地儲存,這將是一種儲存浪費
  5. 當合約自毀到底發生了什麼時,它提到程式碼將從區塊鏈中刪除,那麼這是否意味著交易使其無法用於後續交易,或者它真的真的改變了區塊鏈並將其從舊塊中刪除?

合約程式碼到底儲存在哪裡,我讀到它儲存在區塊鏈中,這是否意味著每個擁有完整區塊鏈實例的節點也都有合約程式碼?

狀態儲存在區塊鏈中,是的。你說每個全節點都有整個區塊鏈的副本,包括所有狀態也是正確的。

礦工是否應該為了探勘一個新區塊首先執行所有合約呼叫並設置值,然後開始尋找 POW 難題解決和隨機值,如果是這樣,那麼我們可以擁有像比特幣這樣的乙太坊 ASIC 礦工,因為他們可以只做一項特定的工作,但每次執行契約程式碼都不同??

礦工的工作是簡單地解決 POW 難題。當他們這樣做時,他們就有能力探勘區塊。他們現在選擇他們想要包含在該特定區塊中的**交易。**這些交易定義了所做的所有狀態更改,因此礦工在技術上不必研究這些。

就 ASIC 問題而言,乙太坊 POW 被設計為記憶體難,這意味著 ASIC 很難探勘。

當礦工想要驗證具有合約呼叫的交易時,它應該執行合約程式碼嗎?如果是這樣,這是否意味著每個合約都可以執行多次,直到最終一個礦工找到正確的 nonce 並解決 pow 難題?如果那是真的,這意味著合約程式碼會不必要地執行多次?

請參閱我上面的回答作為這個問題的答案。總而言之,礦工只需選擇一筆交易。它沒有多次執行的原因是只有一個礦工首先找到了區塊並因此獲得獎勵。這是唯一將交易以及合約呼叫廣播到乙太坊網路的礦工。

合約變數的值儲存在哪裡,我的意思是,如果我們有一個可靠映射,它可以包含很多鍵值,那麼這個鍵值儲存在哪裡?如果它們儲存在區塊鏈中,那麼它們應該儲存在具有區塊鏈副本的每個節點中,這意味著大量數據會一遍又一遍地儲存,這將是一種儲存浪費

見答案一。你是對的——區塊鏈(就目前而言)效率很低且速度很慢,而且每個節點持有該狀態的副本。

當合約自毀到底發生了什麼時,它提到程式碼將從區塊鏈中刪除,那麼這是否意味著交易使其無法用於後續交易,或者它真的改變了區塊鏈並將其從舊塊中刪除? ?

它不會改變區塊鏈,因為這是不可能的。它所做的(沒有太多技術性)是不允許任何人再次呼叫該合約。最好的例子是Parity 錢包漏洞利用,因為它是使用selfdestruct.

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