Solidity

Solidity 視圖/純函式可以任意複雜嗎?

  • January 16, 2022

非常量函式的計算複雜度受到塊氣體限制的限制。我假設但不確定這不適用於view/pure函式。view/函式是否pure以任何方式限制了計算複雜性,除了我必須等待很長一段時間直到執行一個長循環?

view/pure功能受到提供給它的氣體的限制。他們仍然“使用”天然氣,即使發件人(from帳戶)沒有為天然氣“收費”。

view,pureSolidity 關鍵字,但目前只是 Javascript web3.js 使用 JSON-RPCeth_call而不是eth_sendTransaction.

https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-methods

// Automatically determines the use of call or sendTransaction based on the method type (constant keyword exists or not?)
myContractInstance.myMethod(param1 [, param2, ...] [, transactionObject] [, defaultBlock] [, callback]);

// Explicitly calling this method
myContractInstance.myMethod.call(param1 [, param2, ...] [, transactionObject] [, defaultBlock] [, callback]);

// Explicitly sending a transaction to this method
myContractInstance.myMethod.sendTransaction(param1 [, param2, ...] [, transactionObject] [, callback]);

call 和 sendTransaction 非常相似(在幕後),主要區別在於前者是模擬。但是模擬仍然“使用”氣體,並且可以理解會引起混亂。要在/函式中執行複雜的計算,您可能需要**明確指定大量氣體,**例如:view``pure``myContractInstance.myMethod.call(param1, {gas:990000000})

例如,Geth“僅”提供5000 萬個 gas:

if msg.gas == nil {
   msg.gas = big.NewInt(50000000)
}

正如@Tjaden 評論的那樣,基本上沒有關於 eth_call 的規範,因此其他客戶端和瀏覽器的可靠性可能與 Geth 不同。

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