Contract-Development

為什麼在創建公共視圖功能時不消耗任何氣體但仍在儲存中寫入?

  • August 25, 2018

我有四個問題。我希望你能幫助我。好主意的問題,也許這對其他人有幫助。提前致謝。

問題 1)我知道,如果您不向儲存寫入任何內容,那麼該功能是免費的。對?我什至可以製作公共視圖功能並製作 thouthands for 循環,但由於沒有理由將此更改分發給其他節點,因此即使 for 循環很大並且即使我在該函式的記憶體中創建新變數,它也必須是免費的。我的想法對嗎?

問題 2)我創建了公共視圖函式,但在該函式中,我寫了一些類似在數組中寫入數字的內容,然後在寫入之後,我從該數組返回了新添加的元素。我觸摸了儲存,我在那裡寫了它。但是因為我將我的函式命名為“view”,所以它沒有要求我將氣體放入 metamask。根本不需要元遮罩,即使我是在儲存中寫的。為什麼?我的觀點是它適用於我,但不適用於其他人,它不會在節點之間傳播。

問題 3)每個人都說你不能從函式返回動態數組。讓我們來看看

$$ $$大批。它是動態的,但我仍然可以返回它。那麼人們是什麼意思呢?我知道我不能返回多維數組和數組結構。但我可以返回 uint$$ $$. 問題 4)我知道,例如,如果儲存中有一些數據uint[] x。現在如果我寫一個類似的函式:uint[] memory mytest = x;儲存中的x數據被複製到記憶體中。我對嗎?如果不?為什麼?如果是的話,它是否有效?從記憶體複製到儲存?但我不這麼認為,因為除非您在執行時指定,否則您以後無法在儲存中寫入任何內容。

  1. 是的。
  2. 呼叫view函式時,使用方法eth_call而不是eth_sendTransaction. 呼叫在本地執行,任何狀態更改都將被丟棄。因此,您對儲存所做的任何寫入都不會持續存在。
  3. “每個人都說你不能從函式中返回動態數組。” 那麼“每個人”都是錯誤的。也許如果你引用了一個來源,有人可以幫助你弄清楚是什麼意思。
  4. 是的,從儲存複製到記憶體。是的,另一種方式也有效:
pragma solidity ^0.4.24;

contract Test {
   uint256[] public foo;

   constructor() public {
       uint256[] memory bar = new uint256[](3);
       bar[0] = 1;
       bar[1] = 2;
       bar[2] = 3;

       foo = bar;
   }
}

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