debug

package
v0.37.10-pr6434-2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 4, 2024 License: AGPL-3.0 Imports: 15 Imported by: 2

README

Remote Debugger

Remote debugger provides utils needed to run transactions and scripts against live network data. It uses GRPC endpoints on an execution nodes to fetch registers and block info when running a transaction. This is mostly provided for debugging purpose and should not be used for production level operations. If you use the caching method you can run the transaction once and use the cached values to run transaction in debugging mode.

sample code

package debug_test

import (
	"fmt"
	"os"
	"testing"

	"github.com/rs/zerolog"
	"github.com/stretchr/testify/require"

	"github.com/onflow/flow-go/model/flow"
	"github.com/onflow/flow-go/utils/debug"
)

func TestDebugger_RunTransaction(t *testing.T) {

	grpcAddress := "localhost:3600"
	chain := flow.Emulator.Chain()
	debugger := debug.NewRemoteDebugger(grpcAddress, chain, zerolog.New(os.Stdout).With().Logger())

	const scriptTemplate = `
	import FlowServiceAccount from 0x%s
	transaction() {
		prepare(signer: &Account) {
			log(signer.balance)
		}
	  }
	`

	script := []byte(fmt.Sprintf(scriptTemplate, chain.ServiceAddress()))
	txBody := flow.NewTransactionBody().
		SetComputeLimit(9999).
		SetScript([]byte(script)).
		SetPayer(chain.ServiceAddress()).
		SetProposalKey(chain.ServiceAddress(), 0, 0)
	txBody.Authorizers = []flow.Address{chain.ServiceAddress()}

	// Run at the latest blockID
	txErr, err := debugger.RunTransaction(txBody)
	require.NoError(t, txErr)
	require.NoError(t, err)

	// Run with blockID (use the file cache)
	blockId, err := flow.HexStringToIdentifier("3a8281395e2c1aaa3b8643d148594b19e2acb477611a8e0cab8a55c46c40b563")
	require.NoError(t, err)
	txErr, err = debugger.RunTransactionAtBlockID(txBody, blockId, "")
	require.NoError(t, txErr)
	require.NoError(t, err)

	testCacheFile := "test.cache"
	defer os.Remove(testCacheFile)
	// the first run would cache the results
	txErr, err = debugger.RunTransactionAtBlockID(txBody, blockId, testCacheFile)
	require.NoError(t, txErr)
	require.NoError(t, err)

	// second one should only use the cache
	// make blockId invalid so if it endsup looking up by id it should fail
	blockId = flow.Identifier{}
	txErr, err = debugger.RunTransactionAtBlockID(txBody, blockId, testCacheFile)
	require.NoError(t, txErr)
	require.NoError(t, err)
}


Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetHeapAllocsBytes added in v0.27.0

func GetHeapAllocsBytes() uint64

GetHeapAllocsBytes returns the value of /gc/heap/allocs:bytes.

Types

type RemoteDebugger added in v0.23.1

type RemoteDebugger struct {
	// contains filtered or unexported fields
}

func NewRemoteDebugger added in v0.23.1

func NewRemoteDebugger(grpcAddress string,
	chain flow.Chain,
	logger zerolog.Logger) *RemoteDebugger

Warning : make sure you use the proper flow-go version, same version as the network you are collecting registers from, otherwise the execution might differ from the way runs on the network

func (*RemoteDebugger) RunScript added in v0.23.1

func (d *RemoteDebugger) RunScript(
	code []byte,
	arguments [][]byte,
) (
	value cadence.Value,
	scriptError error,
	processError error,
)

func (*RemoteDebugger) RunScriptAtBlockID added in v0.23.1

func (d *RemoteDebugger) RunScriptAtBlockID(
	code []byte,
	arguments [][]byte,
	blockID flow.Identifier,
) (
	value cadence.Value,
	scriptError error,
	processError error,
)

func (*RemoteDebugger) RunTransaction added in v0.23.1

func (d *RemoteDebugger) RunTransaction(
	txBody *flow.TransactionBody,
) (
	txErr error,
	processError error,
)

RunTransaction runs the transaction given the latest sealed block data

func (*RemoteDebugger) RunTransactionAtBlockID added in v0.23.1

func (d *RemoteDebugger) RunTransactionAtBlockID(
	txBody *flow.TransactionBody,
	blockID flow.Identifier,
	regCachePath string,
) (
	txErr error,
	processError error,
)

RunTransaction runs the transaction and tries to collect the registers at the given blockID note that it would be very likely that block is far in the past and you can't find the trie to read the registers from. if regCachePath is empty, the register values won't be cached

type RemoteStorageSnapshot added in v0.30.0

type RemoteStorageSnapshot struct {
	Cache       registerCache
	BlockID     []byte
	BlockHeader *flow.Header
	// contains filtered or unexported fields
}

RemoteStorageSnapshot provides a storage snapshot connected to a live execution node to read the registers.

func NewRemoteStorageSnapshot added in v0.30.0

func NewRemoteStorageSnapshot(
	grpcAddress string,
	opts ...RemoteStorageSnapshotOption,
) *RemoteStorageSnapshot

func (*RemoteStorageSnapshot) Close added in v0.30.0

func (snapshot *RemoteStorageSnapshot) Close() error

func (*RemoteStorageSnapshot) Get added in v0.30.0

func (snapshot *RemoteStorageSnapshot) Get(
	id flow.RegisterID,
) (
	flow.RegisterValue,
	error,
)

type RemoteStorageSnapshotOption added in v0.30.0

type RemoteStorageSnapshotOption func(*RemoteStorageSnapshot) *RemoteStorageSnapshot

A RemoteStorageSnapshotOption sets a configuration parameter for the remote snapshot

func WithBlockID added in v0.23.1

func WithBlockID(blockID flow.Identifier) RemoteStorageSnapshotOption

WithBlockID sets the blockID for the remote snapshot, if not used remote snapshot will use the latest sealed block

func WithCache added in v0.23.1

func WithCache(cache registerCache) RemoteStorageSnapshotOption

WithFileCache sets the output path to store register values so can be fetched from a file cache it loads the values from the cache upon object construction

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL