Usage

Here are simple guidelines regarding how to use the NeoJsonRPC client.

Client initialization

The first step to interact with the NEO JSON-RPC interface is to initialize a neojsonrpc.Client instance. The following examples respectively show how to get clients for the TestNet, the MainNet and an hypothetical local PrivNet:

>>> from neojsonrpc import Client
>>> testnet_client = Client.for_testnet()
>>> mainnet_client = Client.for_mainnet()
>>> privnet_client = Client(host='localhost', port='30333')

It should be noted that you can configure you client to interact with a JSON-RPC server over TLS using the tls keyword argument:

>>> from neojsonrpc import Client
>>> client = Client(host='seed3.neo.org', port=20331, tls=True)

Interacting with the blockchain

You can easily call some of the JSON-RPC methods once your client is initialized. These methods allow you to get various blockchain data from NEO nodes. Here are some examples:

>>> from neojsonrpc import Client
>>> client = Client.for_testnet()
>>>
>>> # Retrieve the block count.
>>> client.get_block_count()
977981
>>>
>>> # Retrieve the information associated with a specific block index.
>>> client.get_block(977981)
{'confirmations': 3,
 'hash': '0x155d6f65eb79730fcb98c8da07d216a150eab432803692c9c9aa04fc895c830d',
  'index': 977981,
  'merkleroot': '0x0e6abef01f17d2ce984fd215266db005b67f0f324df6bcf2b42b1b692226941f',
  'nextblockhash': '0xd7127e3b204b3c5e2ac71914f1a0bec5107e83203571b4e551364df60496d205',
  'nextconsensus': 'AdyQbbn6ENjqWDa5JNYMwN3ikNcA4JeZdk',
  'nonce': '42bfbbe8b95c8796',
  'previousblockhash': '0x3f1438acc3c949fa9f97181cefb4b4f0e376d996c25398bc70159ae75e52be00',
  'script': {'invocation': '402432acc12f362031be5d4da6cbeda3a9b7aa61482e234b979f96e30d051278c4ad5711e86e136cf9a6a8450626a88ec82d300c653fe04441c565500d84e830cb40722819145260429c87be0804459857ad5d273af36f976e045ecd660afb76990395ceb183ae95427147c47b54c2c1d6678341c850dd320b70af36aaab81f22bb7401e65f039c288f77dbc5fdc68f990c1901e9b20cf66805ff6a9e4e4c7528cc4e7b8c50d7e166e292e72a11f51a5b851a2b92f1bfe6fe12c01914722116c20347e40f7fbfbe25e1465b1120dd7b7d8f1bb1d501f8d1433808b53926be7ef6a08010e729b3520d2e31ea0436d2034ebf3481dd82df98c2833e9614e3d5fa2efa3a12e40002815ea581330df0e1e01bdecbd96e133ed06949c112555f8b9b2f1c49387cd2df198fcec1a1e94c66a55a27c2852f39a398a05f65859acba74eb9d29dea467',
  'verification': '55210209e7fd41dfb5c2f8dc72eb30358ac100ea8c72da18847befe06eade68cebfcb9210327da12b5c40200e9f65569476bbff2218da4f32548ff43b6387ec1416a231ee821034ff5ceeac41acf22cd5ed2da17a6df4dd8358fcb2bfb1a43208ad0feaab2746b21026ce35b29147ad09e4afe4ec4a7319095f08198fa8babbe3c56e970b143528d2221038dddc06ce687677a53d54f096d2591ba2302068cf123c1f2d75c2dddc542557921039dafd8571a641058ccc832c5e2111ea39b09c0bde36050914384f7a48bce9bf92102d02b1873a0863cd042cc717da31cea0d7cf9db32b74d4c72c01b0011503e2e2257ae'},
  'size': 987,
  'time': 1515362895,
  'tx': [{'attributes': [],
          'net_fee': '0',
          'nonce': 3109848982,
          'scripts': [],
          'size': 10,
          'sys_fee': '0',
          'txid': '0xd0884f26dc433e40f45ac5a5c310979e8a9c14925ba8523582933e2905cf51ed',
          'type': 'MinerTransaction',
          'version': 0,
          'vin': [],
          'vout': []},
         {'attributes': [],
          'gas': '0',
          'net_fee': '0',
          'script': '4cf67b227265636f72644964223a227265636f72645f746573745f39383335222c226164647265737346726f6d223a2230303a44303a39363a37373a39323a4334222c22666f726d5032704964223a223834393337346636323239373431366361353234393462616630316236633933222c2261646472657373546f223a226363653263323465373739633461363339373834316165653561336239623661222c22746f5032704964223a226164376263326663643130613437306261626337333530643361663233653262222c22716c63223a2237363732222c2274696d65223a22323031382d30312d30382030363a30383a3030227d107265636f72645f746573745f3938333552c103707574676d6e117953310c0a6dc79d0fcff59916dbdb7c5e',
          'scripts': [],
          'size': 301,
          'sys_fee': '0',
          'txid': '0x5c9cdc113a7adb58320786f2be8009b1fb723bd164b6d9e6025f019203beeeb8',
          'type': 'InvocationTransaction',
          'version': 1,
          'vin': [],
          'vout': []}],
 'version': 0}

Note

Please refer to Client reference for a full list of the available methods.

Invoking & testing smart contracts

NeoJsonRPC implements the invoke, invokefunction and invokescript methods provided by NEO nodes through the JSON-RPC interface. It should be noted that these methods are to test VM scripts as if they wre ran on the blockchain. The underlying RPC calls don’t affect the blockchain in any way (no transaction is generated, nothing is stored on the contract’s storage). Here is a simple example using the invoke_function method:

>>> from neojsonrpc import Client
>>> client = Client.for_testnet()
>>> result = client.invoke_function('34af1b6634fcd7cfcff0158965b18601d3837e32', 'symbol', [])
{'gas_consumed': '0.217',
 'stack': [{'type': 'ByteArray', 'value': bytearray(b'TKN')}],
 'state': 'HALT, BREAK'}

It should be noted that NeoJsonRPC provides a more high-level interface for interacting with contract fonctions as if they were Python class instance methods:

>>> contract = client.contract('34af1b6634fcd7cfcff0158965b18601d3837e32')
>>> contract.symbol()
{'gas_consumed': '0.217',
 'stack': [{'type': 'ByteArray', 'value': bytearray(b'TKN')}],
 'state': 'HALT, BREAK'}