限制呼叫靜態函式的次數
就我而言,當智能合約中的函式被定義為 pure 或 view 時,可以呼叫它而無需為其執行所需的 gas 消耗付費。這種類型的功能不會改變智能合約的狀態,因此不需要作為區塊鏈中的新塊來執行和探勘。
然而,這種行為會為濫用打開大門。任何人都可以嘗試在特定節點上重複呼叫此類函式以使其工作而無需獎勵。
所以,我想知道我的說法是對還是錯:
- Pure & view 函式可能會被濫用,因為任何人都可以呼叫它們而無需為其執行付費。
- Pure & view 函式在鏈下執行,因為它們的執行不會改變合約的狀態。
- 當在鏈下執行時,該函式通常在單個節點上執行,該節點用作提供者(例如,本地 geth 節點或遠端 Infura 節點)。
如果 1. 是正確的,有沒有辦法防止這種情況發生?我不是指一種限制長時間執行的方法,而是一種限制某些帳戶對單個函式的多次呼叫的方法。這是我想澄清的事情,因為該問題被標記為View/Pure Gas 使用的可能重複 - 如果由另一個函式在內部呼叫,則成本氣體?
我可以想到基於防火牆的解決方案,但像 Geth 這樣的乙太坊客戶端是否提供任何對策?這個問題可以在solidity級別解決嗎?我想到讓我的所有功能都不是靜態的,但這對誠實的使用者是有害的。
如果 2 和 3 正確,我可以認為遠端不誠實節點向客戶端返回錯誤結果。所以我想,這不一定是真的,並且有一種方法可以強制呼叫純/視圖函式以分佈式執行。在這種情況下,如果函式沒有改變合約上的任何內容,那麼函式的執行會對區塊鏈產生任何影響嗎?是否會向客戶收取任何汽油費?
感謝您的意見!
Pure & view 函式可能會被濫用,因為任何人都可以呼叫它們而無需為其執行付費。
不完全是。如果它們是從正在執行狀態更改事務的合約中呼叫的,那麼它們是每個完整節點必須執行的事務的一部分。不過,這沒關係,因為天然氣會計適用。
Pure & view 函式在鏈下執行,因為它們的執行不會改變合約的狀態。
如果使用者直接呼叫它們,則
view
/的函式可以在本地執行。pure
他們可以隨心所欲地做到這一點,因為他們使用自己的硬體和自己的鏈副本。如果view
/pure
函式被合約呼叫,那麼每個人都必須執行它,並且發送者需要支付 gas。當在鏈下執行時,該函式通常在單個節點上執行,該節點用作提供者(例如,本地 geth 節點或遠端 Infura 節點)。
一個鏈下只讀函式在呼叫者的電腦上本地執行。網路甚至沒有被告知。
更詳細的解釋:https ://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2
希望能幫助到你。
細化
pragma solidity 0.5.1; contract ConstantAndTransaction { uint trivial; function getTrivial() public view returns(uint) { // When called directly, this function is run locally and gas is refunded. // The network is not consulted. return trivial; } function add(uint x) public { // This is normally a state-changing transaction. It relies on inspecting a read-only function. // That means all nodes will run the read-only function and the sender will pay for it. trivial += getTrivial() + x; } }