Skip to content

Commit

Permalink
add accounts
Browse files Browse the repository at this point in the history
  • Loading branch information
jennijuju committed Mar 31, 2023
1 parent 07c9367 commit 77883aa
Show file tree
Hide file tree
Showing 3 changed files with 223 additions and 123 deletions.
122 changes: 0 additions & 122 deletions cmd/lotus-shed/evmbalance.go

This file was deleted.

222 changes: 222 additions & 0 deletions cmd/lotus-shed/fevmanalytics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
package main

import (
"fmt"
"os"
"path/filepath"

"github.com/filecoin-project/go-state-types/big"

badgerbs "github.com/filecoin-project/lotus/blockstore/badger"
"github.com/filecoin-project/lotus/chain/actors/builtin"

"github.com/filecoin-project/go-state-types/abi"
"github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
"github.com/urfave/cli/v2"
"golang.org/x/xerrors"

"github.com/filecoin-project/go-address"

"github.com/filecoin-project/lotus/chain/state"
"github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/lotus/node/repo"
)

var FevmAnalyticsCmd = &cli.Command{
Name: "evm-analytics",
Usage: "Get FEVM related metrics",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "repo",
Value: "~/.lotus",
},
},
Subcommands: []*cli.Command{
FevmBalanceCmd,
FevmActorsCmd,
},
}

var FevmBalanceCmd = &cli.Command{
Name: "evm-balance",
Usage: "Balances in eth accounts, evm contracts and placeholders",
ArgsUsage: "[state root]",

Action: func(cctx *cli.Context) error {
if cctx.NArg() != 1 {
return xerrors.New("only needs state root")
}

if !cctx.Args().Present() {
return fmt.Errorf("must pass state root")
}

sroot, err := cid.Decode(cctx.Args().First())
if err != nil {
return fmt.Errorf("failed to parse input: %w", err)
}

fsrepo, err := repo.NewFS(cctx.String("repo"))
if err != nil {
return err
}

lkrepo, err := fsrepo.Lock(repo.FullNode)
if err != nil {
return err
}

defer lkrepo.Close() //nolint:errcheck

path, err := lkrepo.SplitstorePath()
if err != nil {
return err
}

path = filepath.Join(path, "hot.badger")
if err := os.MkdirAll(path, 0755); err != nil {
return err
}

opts, err := repo.BadgerBlockstoreOptions(repo.HotBlockstore, path, lkrepo.Readonly())
if err != nil {
return err
}

bs, err := badgerbs.Open(opts)
if err != nil {
return err
}

cst := cbor.NewCborStore(bs)
st, err := state.LoadStateTree(cst, sroot)
if err != nil {
return err
}

fmt.Println("iterating over all actors")
count := 0
balanceEvm := abi.NewTokenAmount(0)
balanceEthAccount := abi.NewTokenAmount(0)
balancePlaceholder := abi.NewTokenAmount(0)

err = st.ForEach(func(addr address.Address, act *types.Actor) error {
if count%200000 == 0 {
fmt.Println("processed /n", count)
}
count++

if builtin.IsEvmActor(act.Code) {
balanceEvm = types.BigAdd(balanceEvm, act.Balance)
}

if builtin.IsEthAccountActor(act.Code) {
balanceEthAccount = types.BigAdd(balanceEthAccount, act.Balance)
}

if builtin.IsPlaceholderActor(act.Code) {
balancePlaceholder = types.BigAdd(balancePlaceholder, act.Balance)
}

return nil
})

fmt.Println("balances in Eth contracts: ", balanceEvm)
fmt.Println("balances in Eth accounts: ", balanceEthAccount)
fmt.Println("balances in placeholder: ", balancePlaceholder)
fmt.Println("Total balances: ", big.Add(big.Add(balanceEthAccount, balancePlaceholder), balanceEvm))
return nil
},
}

var FevmActorsCmd = &cli.Command{
Name: "evm-actors",
Usage: "actors # in eth accounts, evm contracts and placeholders",
ArgsUsage: "[state root]",

Action: func(cctx *cli.Context) error {
if cctx.NArg() != 1 {
return xerrors.New("only needs state root")
}

if !cctx.Args().Present() {
return fmt.Errorf("must pass state root")
}

sroot, err := cid.Decode(cctx.Args().First())
if err != nil {
return fmt.Errorf("failed to parse input: %w", err)
}

fsrepo, err := repo.NewFS(cctx.String("repo"))
if err != nil {
return err
}

lkrepo, err := fsrepo.Lock(repo.FullNode)
if err != nil {
return err
}

defer lkrepo.Close() //nolint:errcheck

path, err := lkrepo.SplitstorePath()
if err != nil {
return err
}

path = filepath.Join(path, "hot.badger")
if err := os.MkdirAll(path, 0755); err != nil {
return err
}

opts, err := repo.BadgerBlockstoreOptions(repo.HotBlockstore, path, lkrepo.Readonly())
if err != nil {
return err
}

bs, err := badgerbs.Open(opts)
if err != nil {
return err
}

cst := cbor.NewCborStore(bs)
st, err := state.LoadStateTree(cst, sroot)
if err != nil {
return err
}

fmt.Println("iterating over all actors")
count := 0
EvmCount := 0
EthAccountCount := 0
PlaceholderCount := 0

err = st.ForEach(func(addr address.Address, act *types.Actor) error {
if count%200000 == 0 {
fmt.Println("processed /n", count)
}
count++

if builtin.IsEvmActor(act.Code) {
EvmCount++
}

if builtin.IsEthAccountActor(act.Code) {
EthAccountCount++
}

if builtin.IsPlaceholderActor(act.Code) {
PlaceholderCount++
}

return nil
})

fmt.Println("# of Eth contracts: ", EvmCount)
fmt.Println("b# of Eth accounts: ", EthAccountCount)
fmt.Println("# of placeholder: ", PlaceholderCount)
return nil
},
}
2 changes: 1 addition & 1 deletion cmd/lotus-shed/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func main() {
gasTraceCmd,
replayOfflineCmd,
msgindexCmd,
evmBalanceCmd,
FevmAnalyticsCmd,
}

app := &cli.App{
Expand Down

0 comments on commit 77883aa

Please sign in to comment.