github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/utils/debug/README.md (about) 1 2 3 ## Remote Debugger 4 5 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. 6 If you use the caching method you can run the transaction once and use the cached values to run transaction in debugging mode. 7 8 ### sample code 9 10 ```GO 11 package debug_test 12 13 import ( 14 "fmt" 15 "os" 16 "testing" 17 18 "github.com/rs/zerolog" 19 "github.com/stretchr/testify/require" 20 21 "github.com/onflow/flow-go/model/flow" 22 "github.com/onflow/flow-go/utils/debug" 23 ) 24 25 func TestDebugger_RunTransaction(t *testing.T) { 26 27 grpcAddress := "localhost:3600" 28 chain := flow.Emulator.Chain() 29 debugger := debug.NewRemoteDebugger(grpcAddress, chain, zerolog.New(os.Stdout).With().Logger()) 30 31 const scriptTemplate = ` 32 import FlowServiceAccount from 0x%s 33 transaction() { 34 prepare(signer: &Account) { 35 log(signer.balance) 36 } 37 } 38 ` 39 40 script := []byte(fmt.Sprintf(scriptTemplate, chain.ServiceAddress())) 41 txBody := flow.NewTransactionBody(). 42 SetComputeLimit(9999). 43 SetScript([]byte(script)). 44 SetPayer(chain.ServiceAddress()). 45 SetProposalKey(chain.ServiceAddress(), 0, 0) 46 txBody.Authorizers = []flow.Address{chain.ServiceAddress()} 47 48 // Run at the latest blockID 49 txErr, err := debugger.RunTransaction(txBody) 50 require.NoError(t, txErr) 51 require.NoError(t, err) 52 53 // Run with blockID (use the file cache) 54 blockId, err := flow.HexStringToIdentifier("3a8281395e2c1aaa3b8643d148594b19e2acb477611a8e0cab8a55c46c40b563") 55 require.NoError(t, err) 56 txErr, err = debugger.RunTransactionAtBlockID(txBody, blockId, "") 57 require.NoError(t, txErr) 58 require.NoError(t, err) 59 60 testCacheFile := "test.cache" 61 defer os.Remove(testCacheFile) 62 // the first run would cache the results 63 txErr, err = debugger.RunTransactionAtBlockID(txBody, blockId, testCacheFile) 64 require.NoError(t, txErr) 65 require.NoError(t, err) 66 67 // second one should only use the cache 68 // make blockId invalid so if it endsup looking up by id it should fail 69 blockId = flow.Identifier{} 70 txErr, err = debugger.RunTransactionAtBlockID(txBody, blockId, testCacheFile) 71 require.NoError(t, txErr) 72 require.NoError(t, err) 73 } 74 75 76 ```