Nicht konstante Funktionen sind in der Rechenkomplexität durch die Sperrgasgrenze begrenzt. Ich gehe davon aus, bin mir aber nicht sicher, dass dies nicht für view
/ pure
-Funktionen gilt. Sind view
/ pure
-Funktionen in irgendeiner Weise in der Rechenkomplexität begrenzt, außer dass ich eine ganze Weile warten müsste, bis zB eine lange Schleife ausgeführt wird?
view
/ pure
Funktionen werden durch das ihm zugeführte Gas eingeschränkt . Sie "verbrauchen" immer noch Gas, obwohl der Absender ( from
Konto) nicht für das Gas "belastet" wird.
view
, pure
sind Solidity-Schlüsselwörter, aber derzeit nur ein Indikator dafür, dass Javascripteth_call
web3.js JSON-RPC anstelle von verwendet 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 und sendTransaction sind sehr ähnlich (unter der Haube), wobei der Hauptunterschied darin besteht, dass Ersteres eine Simulation ist. Aber die Simulation "verbraucht" immer noch Gas und kann verständlicherweise Verwirrung stiften. Um eine komplexe Berechnung in einer view
/ -Funktion durchzuführen pure
, müssen Sie möglicherweise explizit viel Gas angeben, z. B.:myContractInstance.myMethod.call(param1, {gas:990000000})
Zum Beispiel liefert Geth „nur“ 50 Millionen Gas:
if msg.gas == nil {
msg.gas = big.NewInt(50000000)
}
Wie @Tjaden kommentierte, gibt es im Grunde keine Spezifikationen zu eth_call, sodass sich andere Clients und Browser-Solidity möglicherweise anders verhalten als Geth.
Die Rechenarbeit, die eine constant
or- non-constant
Funktion benötigt, ist die gleiche, wenn Sie Ihren Vertrag erstellen oder wenn Sie die Funktion ausführen. Die anfänglichen Kosten hängen von den in der EVM ausgeführten Operationen ab, jeder Opcode hat seinen eigenen Preis. Sie können die Liste hier überprüfen (möglicherweise veraltet).
Das Schlüsselwort "constant" gibt jedoch an, dass die Funktion die Zustände nicht ändern soll und kein Gas verwendet wird, da die Funktion dadurch locally/off blockchain
in Ihrem Knoten ausgeführt werden kann.
Prüfung :
Bearbeiten : Versuchen wir, eine Schleife innerhalb einer konstanten Funktion auszuführen, um eine Vorstellung von der Rechenarbeit zu bekommen:
pragma solidity ^0.4.0;
contract test_compexity{
function f(uint256 n) constant returns (uint256) {
uint256 j=0;
while(j<n){
j=j+1;
}
return j;
}
}
Wenn wir diese konstante Funktion mit der Eingabe 1001 ausführen, erhalten wir das Ergebnis 0X
Wenn wir dieselbe Funktion ohne den konstanten Typ und mit derselben Eingabe ausführen, erhalten wir einen Fehler:Gas required exceeds limit
Selbst wenn wir also eine konstante Funktion verwenden, unterliegen wir immer noch der gasLimit-Beschränkung. Stellen Sie es sich so vor, als ob Sie die konstante Funktion verwenden, die Sie gerade innerhalb eines gasLimits bezahlen.
constant
Funktionen gibt.j
innerhalb der Funktion sollte beliebig große Gasspezifikationen ermöglichen. Zur Verdeutlichung: Remix erzwingt, dass die Ansicht den Status nicht ändert, der Solc-Compiler jedoch noch nicht, sodass dies beim Testen auf Ihrer Station nicht funktionieren würde.
Tjaden Hess
constant
Schlüsselwort ist eigentlich kein Teil der Protokollspezifikation, daher hängt sein Verhalten in Grenzfällen weitgehend vom Client ab. Die einzige relevante Spezifikation ist die JSON-RPC- Methodeeth_call
. In der Praxis respektieren die meisten Kunden das Gaslimit für den Block, in dem sie die Transaktion simulieren, aber Sie sollten sich nicht darauf verlassen, dass dies bei allen Kunden der Fall ist.