mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-12-24 09:25:21 +00:00
core: take into account size fee during verifyTxWitnesses
GasLimit for transaction scripts verification should not include fee for transaction size.
This commit is contained in:
parent
2b11e99225
commit
e34e367a7b
5 changed files with 29 additions and 9 deletions
|
@ -1554,7 +1554,7 @@ func (bc *Blockchain) verifyTxWitnesses(t *transaction.Transaction, block *block
|
||||||
return fmt.Errorf("%w: %d vs %d", ErrTxInvalidWitnessNum, len(t.Signers), len(t.Scripts))
|
return fmt.Errorf("%w: %d vs %d", ErrTxInvalidWitnessNum, len(t.Signers), len(t.Scripts))
|
||||||
}
|
}
|
||||||
interopCtx := bc.newInteropContext(trigger.Verification, bc.dao, block, t)
|
interopCtx := bc.newInteropContext(trigger.Verification, bc.dao, block, t)
|
||||||
gasLimit := t.NetworkFee
|
gasLimit := t.NetworkFee - int64(t.Size())*bc.FeePerByte()
|
||||||
for i := range t.Signers {
|
for i := range t.Signers {
|
||||||
gasConsumed, err := bc.verifyHashAgainstScript(t.Signers[i].Account, &t.Scripts[i], interopCtx, gasLimit)
|
gasConsumed, err := bc.verifyHashAgainstScript(t.Signers[i].Account, &t.Scripts[i], interopCtx, gasLimit)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -298,6 +298,26 @@ func TestVerifyTx(t *testing.T) {
|
||||||
require.NoError(t, accs[0].SignTx(tx))
|
require.NoError(t, accs[0].SignTx(tx))
|
||||||
checkErr(t, ErrTxSmallNetworkFee, tx)
|
checkErr(t, ErrTxSmallNetworkFee, tx)
|
||||||
})
|
})
|
||||||
|
t.Run("AlmostEnoughNetworkFee", func(t *testing.T) {
|
||||||
|
tx := bc.newTestTx(h, testScript)
|
||||||
|
verificationNetFee, calcultedScriptSize := CalculateNetworkFee(accs[0].Contract.Script)
|
||||||
|
expectedSize := io.GetVarSize(tx) + calcultedScriptSize
|
||||||
|
calculatedNetFee := verificationNetFee + int64(expectedSize)*bc.FeePerByte()
|
||||||
|
tx.NetworkFee = calculatedNetFee - 1
|
||||||
|
require.NoError(t, accs[0].SignTx(tx))
|
||||||
|
require.Equal(t, expectedSize, io.GetVarSize(tx))
|
||||||
|
checkErr(t, ErrVerificationFailed, tx)
|
||||||
|
})
|
||||||
|
t.Run("EnoughNetworkFee", func(t *testing.T) {
|
||||||
|
tx := bc.newTestTx(h, testScript)
|
||||||
|
verificationNetFee, calcultedScriptSize := CalculateNetworkFee(accs[0].Contract.Script)
|
||||||
|
expectedSize := io.GetVarSize(tx) + calcultedScriptSize
|
||||||
|
calculatedNetFee := verificationNetFee + int64(expectedSize)*bc.FeePerByte()
|
||||||
|
tx.NetworkFee = calculatedNetFee
|
||||||
|
require.NoError(t, accs[0].SignTx(tx))
|
||||||
|
require.Equal(t, expectedSize, io.GetVarSize(tx))
|
||||||
|
require.NoError(t, bc.VerifyTx(tx))
|
||||||
|
})
|
||||||
t.Run("CalculateNetworkFee, signature script", func(t *testing.T) {
|
t.Run("CalculateNetworkFee, signature script", func(t *testing.T) {
|
||||||
tx := bc.newTestTx(h, testScript)
|
tx := bc.newTestTx(h, testScript)
|
||||||
expectedSize := io.GetVarSize(tx)
|
expectedSize := io.GetVarSize(tx)
|
||||||
|
|
|
@ -206,7 +206,7 @@ func TestCreateBasicChain(t *testing.T) {
|
||||||
bw := io.NewBufBinWriter()
|
bw := io.NewBufBinWriter()
|
||||||
b.EncodeBinary(bw.BinWriter)
|
b.EncodeBinary(bw.BinWriter)
|
||||||
require.NoError(t, bw.Err)
|
require.NoError(t, bw.Err)
|
||||||
t.Logf("Block1 hex: %s", bw.Bytes())
|
t.Logf("Block1 hex: %s", hex.EncodeToString(bw.Bytes()))
|
||||||
t.Logf("txMoveNeo hash: %s", txMoveNeo.Hash().StringLE())
|
t.Logf("txMoveNeo hash: %s", txMoveNeo.Hash().StringLE())
|
||||||
t.Logf("txMoveNeo hex: %s", hex.EncodeToString(txMoveNeo.Bytes()))
|
t.Logf("txMoveNeo hex: %s", hex.EncodeToString(txMoveNeo.Bytes()))
|
||||||
t.Logf("txMoveGas hash: %s", txMoveGas.Hash().StringLE())
|
t.Logf("txMoveGas hash: %s", txMoveGas.Hash().StringLE())
|
||||||
|
|
|
@ -54,11 +54,11 @@ type rpcTestCase struct {
|
||||||
check func(t *testing.T, e *executor, result interface{})
|
check func(t *testing.T, e *executor, result interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
const testContractHash = "4546ec6fcdaa1c3ccdb048526b78624b457b60a4"
|
const testContractHash = "b0fda4dd46b8e5d207e86e774a4a133c6db69ee7"
|
||||||
const deploymentTxHash = "17be1bbb0fdecae18cd4c6a2db19311f47bd540371e2ea479a46b349a66aa0b3"
|
const deploymentTxHash = "59f7b22b90e26f883a56b916c1580e3ee4f13caded686353cd77577e6194c173"
|
||||||
|
|
||||||
const verifyContractHash = "47ef649f9a77cad161ddaa28b39c7e450e5429e7"
|
const verifyContractHash = "c1213693b22cb0454a436d6e0bd76b8c0a3bfdf7"
|
||||||
const verifyContractAVM = "560340570300412d510830db4121700c14aa8acf859d4fe402b34e673f2156821796a488ebdb30716813cedb2869db289740"
|
const verifyContractAVM = "570300412d51083021700c14aa8acf859d4fe402b34e673f2156821796a488ebdb30716813cedb2869db289740"
|
||||||
|
|
||||||
var rpcTestCases = map[string][]rpcTestCase{
|
var rpcTestCases = map[string][]rpcTestCase{
|
||||||
"getapplicationlog": {
|
"getapplicationlog": {
|
||||||
|
@ -643,12 +643,12 @@ var rpcTestCases = map[string][]rpcTestCase{
|
||||||
"sendrawtransaction": {
|
"sendrawtransaction": {
|
||||||
{
|
{
|
||||||
name: "positive",
|
name: "positive",
|
||||||
params: `["000a0000008096980000000000721b130000000000b004000001aa8acf859d4fe402b34e673f2156821796a488eb01005d0300e87648170000000c1478ba4c24009fe510e136c9995a2e05215e1be4dc0c14aa8acf859d4fe402b34e673f2156821796a488eb13c00c087472616e736665720c1425059ecb4878d3a875f91c51ceded330d4575fde41627d5b523801420c40b99503c74bb1861b0b45060501dd090224f6c404aca8c02ccba3243c9b9691c1ef9e6b824d731f8fab27c56ba75609d32d2d176e97f56d9e3780610c83ebd41a290c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b4195440d78"]`,
|
params: `["000b0000008096980000000000261c130000000000b004000001aa8acf859d4fe402b34e673f2156821796a488eb01005d0300e87648170000000c1478ba4c24009fe510e136c9995a2e05215e1be4dc0c14aa8acf859d4fe402b34e673f2156821796a488eb13c00c087472616e736665720c1425059ecb4878d3a875f91c51ceded330d4575fde41627d5b523801420c40ea2f56acf7f64629dc922d65a60176f3963afd4b7c259f2017a3a5139346f8ea54704624590832acb7794069ab2983ddc862b03b6a33d4428cd4c45cbc0941c2290c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc20b4195440d78"]`,
|
||||||
result: func(e *executor) interface{} { return &result.RelayResult{} },
|
result: func(e *executor) interface{} { return &result.RelayResult{} },
|
||||||
check: func(t *testing.T, e *executor, inv interface{}) {
|
check: func(t *testing.T, e *executor, inv interface{}) {
|
||||||
res, ok := inv.(*result.RelayResult)
|
res, ok := inv.(*result.RelayResult)
|
||||||
require.True(t, ok)
|
require.True(t, ok)
|
||||||
expectedHash, err := util.Uint256DecodeStringLE("8b6e610a2205914411b26c4380594fa9a1e16961ff5896ed3b16831a151c6dd0")
|
expectedHash, err := util.Uint256DecodeStringLE("ab5573cfc8d70774f04aa7d5521350cfc1aa1239c44c24e490e139408cd46a57")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, expectedHash, res.Hash)
|
assert.Equal(t, expectedHash, res.Hash)
|
||||||
},
|
},
|
||||||
|
@ -1075,7 +1075,7 @@ func checkNep5Balances(t *testing.T, e *executor, acc interface{}) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Asset: e.chain.UtilityTokenHash(),
|
Asset: e.chain.UtilityTokenHash(),
|
||||||
Amount: "799.59495030",
|
Amount: "799.59641770",
|
||||||
LastUpdated: 7,
|
LastUpdated: 7,
|
||||||
}},
|
}},
|
||||||
Address: testchain.PrivateKeyByID(0).GetScriptHash().StringLE(),
|
Address: testchain.PrivateKeyByID(0).GetScriptHash().StringLE(),
|
||||||
|
|
BIN
pkg/rpc/server/testdata/testblocks.acc
vendored
BIN
pkg/rpc/server/testdata/testblocks.acc
vendored
Binary file not shown.
Loading…
Reference in a new issue