forked from TrueCloudLab/neoneo-go
core: limit GAS available for block verification
This commit is contained in:
parent
395f4ea46d
commit
419d68329c
1 changed files with 7 additions and 4 deletions
|
@ -36,6 +36,7 @@ const (
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
||||||
defaultMemPoolSize = 50000
|
defaultMemPoolSize = 50000
|
||||||
|
verificationGasLimit = 100000000 // 1 GAS
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -1294,13 +1295,15 @@ func ScriptFromWitness(hash util.Uint160, witness *transaction.Witness) ([]byte,
|
||||||
}
|
}
|
||||||
|
|
||||||
// verifyHashAgainstScript verifies given hash against the given witness.
|
// verifyHashAgainstScript verifies given hash against the given witness.
|
||||||
func (bc *Blockchain) verifyHashAgainstScript(hash util.Uint160, witness *transaction.Witness, interopCtx *interop.Context, useKeys bool) error {
|
func (bc *Blockchain) verifyHashAgainstScript(hash util.Uint160, witness *transaction.Witness, interopCtx *interop.Context, useKeys bool, gas int64) error {
|
||||||
verification, err := ScriptFromWitness(hash, witness)
|
verification, err := ScriptFromWitness(hash, witness)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
vm := SpawnVM(interopCtx)
|
vm := SpawnVM(interopCtx)
|
||||||
|
vm.SetPriceGetter(getPrice)
|
||||||
|
vm.GasLimit = gas
|
||||||
vm.LoadScriptWithFlags(verification, smartcontract.ReadOnly)
|
vm.LoadScriptWithFlags(verification, smartcontract.ReadOnly)
|
||||||
vm.LoadScript(witness.InvocationScript)
|
vm.LoadScript(witness.InvocationScript)
|
||||||
if useKeys {
|
if useKeys {
|
||||||
|
@ -1355,7 +1358,7 @@ func (bc *Blockchain) verifyTxWitnesses(t *transaction.Transaction, block *block
|
||||||
sort.Slice(witnesses, func(i, j int) bool { return witnesses[i].ScriptHash().Less(witnesses[j].ScriptHash()) })
|
sort.Slice(witnesses, func(i, j int) bool { return witnesses[i].ScriptHash().Less(witnesses[j].ScriptHash()) })
|
||||||
interopCtx := bc.newInteropContext(trigger.Verification, bc.dao, block, t)
|
interopCtx := bc.newInteropContext(trigger.Verification, bc.dao, block, t)
|
||||||
for i := 0; i < len(hashes); i++ {
|
for i := 0; i < len(hashes); i++ {
|
||||||
err := bc.verifyHashAgainstScript(hashes[i], &witnesses[i], interopCtx, false)
|
err := bc.verifyHashAgainstScript(hashes[i], &witnesses[i], interopCtx, false, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
numStr := fmt.Sprintf("witness #%d", i)
|
numStr := fmt.Sprintf("witness #%d", i)
|
||||||
return errors.Wrap(err, numStr)
|
return errors.Wrap(err, numStr)
|
||||||
|
@ -1375,7 +1378,7 @@ func (bc *Blockchain) verifyHeaderWitnesses(currHeader, prevHeader *block.Header
|
||||||
}
|
}
|
||||||
interopCtx := bc.newInteropContext(trigger.Verification, bc.dao, nil, nil)
|
interopCtx := bc.newInteropContext(trigger.Verification, bc.dao, nil, nil)
|
||||||
interopCtx.Container = currHeader
|
interopCtx.Container = currHeader
|
||||||
return bc.verifyHashAgainstScript(hash, &currHeader.Script, interopCtx, true)
|
return bc.verifyHashAgainstScript(hash, &currHeader.Script, interopCtx, true, verificationGasLimit)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GoverningTokenHash returns the governing token (NEO) native contract hash.
|
// GoverningTokenHash returns the governing token (NEO) native contract hash.
|
||||||
|
|
Loading…
Add table
Reference in a new issue