Skip to content

Commit 251c2e2

Browse files
author
Tural Devrishev
committed
scripts: add script for gasConsumed comparison
Signed-off-by: Tural Devrishev <tural@nspcc.ru>
1 parent c41054f commit 251c2e2

1 file changed

Lines changed: 98 additions & 0 deletions

File tree

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
"os"
8+
9+
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
10+
"github.com/urfave/cli/v2"
11+
)
12+
13+
func initClient(addr string, name string) (*rpcclient.Client, uint32, error) {
14+
c, err := rpcclient.New(context.Background(), addr, rpcclient.Options{})
15+
if err != nil {
16+
return nil, 0, fmt.Errorf("RPC %s: %w", name, err)
17+
}
18+
if err = c.Init(); err != nil {
19+
return nil, 0, fmt.Errorf("RPC %s init: %w", name, err)
20+
}
21+
h, err := c.GetBlockCount()
22+
if err != nil {
23+
return nil, 0, fmt.Errorf("RPC %s block count: %w", name, err)
24+
}
25+
return c, h, nil
26+
}
27+
28+
func cliMain(c *cli.Context) error {
29+
a := c.Args().Get(0)
30+
b := c.Args().Get(1)
31+
if a == "" || b == "" {
32+
return errors.New("usage: compare-gasconsumed RPC_A RPC_B TARGET_BLOCK_INDEX")
33+
}
34+
var target uint32
35+
_, err := fmt.Sscan(c.Args().Get(2), &target)
36+
if err != nil {
37+
return fmt.Errorf("invalid target block index: %w", err)
38+
}
39+
40+
ca, ha, err := initClient(a, "A")
41+
if err != nil {
42+
return err
43+
}
44+
cb, hb, err := initClient(b, "B")
45+
if err != nil {
46+
return err
47+
}
48+
49+
// Allow some height drift but ensure target is within available range.
50+
if target >= ha || target >= hb {
51+
return fmt.Errorf("target %d is beyond available blocks: A has %d, B has %d", target, ha, hb)
52+
}
53+
54+
for i := uint32(0); i <= target; i++ {
55+
ba, err := ca.GetBlockByIndex(i)
56+
if err != nil {
57+
return fmt.Errorf("can't get block %d from A: %w", i, err)
58+
}
59+
bb, err := cb.GetBlockByIndex(i)
60+
if err != nil {
61+
return fmt.Errorf("can't get block %d from B: %w", i, err)
62+
}
63+
for ti := range ba.Transactions {
64+
txA := ba.Transactions[ti]
65+
txB := bb.Transactions[ti]
66+
if !txA.Hash().Equals(txB.Hash()) {
67+
return fmt.Errorf("different txs at same position in block %d: A has %s, B has %s", i, txA.Hash().StringLE(), txB.Hash().StringLE())
68+
}
69+
la, err := ca.GetApplicationLog(txA.Hash(), nil)
70+
if err != nil {
71+
return fmt.Errorf("can't get applog for tx %s from A: %w", txA.Hash().StringLE(), err)
72+
}
73+
lb, err := cb.GetApplicationLog(txB.Hash(), nil)
74+
if err != nil {
75+
return fmt.Errorf("can't get applog for tx %s from B: %w", txB.Hash().StringLE(), err)
76+
}
77+
ga := la.Executions[0].GasConsumed
78+
gb := lb.Executions[0].GasConsumed
79+
if ga != gb {
80+
fmt.Printf("mismatch at block %d, tx %s: gasConsumed A=%d B=%d\n", i, txA.Hash().StringLE(), ga, gb)
81+
return errors.New("gas mismatch found")
82+
}
83+
}
84+
}
85+
return nil
86+
}
87+
88+
func main() {
89+
ctl := cli.NewApp()
90+
ctl.Name = "compare-gasconsumed"
91+
ctl.Version = "1.0"
92+
ctl.Usage = "compare-gasconsumed RPC_A RPC_B TARGET_BLOCK_INDEX"
93+
ctl.Action = cliMain
94+
if err := ctl.Run(os.Args); err != nil {
95+
fmt.Fprintln(os.Stderr, err)
96+
os.Exit(1)
97+
}
98+
}

0 commit comments

Comments
 (0)