corda/docs/source/tutorial-clientrpc-api.rst

3.8 KiB

Client RPC API Tutorial

In this tutorial we will build a simple command line utility that connects to a node, creates some Cash transactions and meanwhile dumps the transaction graph to the standard output. We will then put some simple visualisation on top. For an explanation on how the RPC works see clientrpc.

We start off by connecting to the node itself. For the purposes of the tutorial we will use the Driver to start up a notary and a node that issues/exits and moves Cash around for herself. To authenticate we will use the certificates of the nodes directly.

Note how we configure the node to create a user that has permission to start the CashProtocol.

example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt

Now we can connect to the node itself using a valid RPC login. We login using the configured user.

example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt

We start generating transactions in a different thread (generateTransactions to be defined later) using proxy, which exposes the full RPC interface of the node:

../../node/src/main/kotlin/net/corda/node/services/messaging/CordaRPCOps.kt

The one we need in order to dump the transaction graph is verifiedTransactions. The type signature tells us that the RPC will return a list of transactions and an Observable stream. This is a general pattern, we query some data and the node will return the current snapshot and future updates done to it.

example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt

The graph will be defined by nodes and edges between them. Each node represents a transaction and edges represent output-input relations. For now let's just print NODE <txhash> for the former and EDGE <txhash> <txhash> for the latter.

example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt

Now we just need to create the transactions themselves!

example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt

We utilise several RPC functions here to query things like the notaries in the node cluster or our own vault.

Then in a loop we generate randomly either an Issue, a Pay or an Exit transaction.

The RPC we need to initiate a Cash transaction is startProtocolDynamic which may start an arbitrary protocol, given sufficient permissions to do so. We won't use this function directly, but rather a type-safe wrapper around it startProtocol that type-checks the arguments for us.

Finally we have everything in place: we start a couple of nodes, connect to them, and start creating transactions while listening on successfully created ones, which are dumped to the console. We just need to run it!:

# Build the example ./gradlew docs/source/example-code:installDist # Start it ./docs/source/example-code/build/install/docs/source/example-code/bin/client-rpc-tutorial Print

Now let's try to visualise the transaction graph. We will use a graph drawing library called graphstream

example-code/src/main/kotlin/net/corda/docs/ClientRpcTutorial.kt

If we run the client with Visualise we should see a simple random graph being drawn as new transactions are being created.