A python interface to load Ccurl library and perform proof of work locally, without relying on a node. To be used together with PyOTA, the Python Client Library for IOTA. For more info, read the docs.
Currently, PyOTA doesn't support performing proof of work locally. The
attach_to_tangle
API command sends the prepared transaction trytes
to an IOTA node, that does the PoW by filling out
attachment_timestamp*
fields and calculating nonce
with Curl
P-81. In case of bundles, transactions are chained together through
their transaction hash
.
To use the module, follow the steps: - Clone the repo from GitHub:
$ git clone https://github.com/iotaledger/ccurl.interface.py.git
- Make sure you have cmake available on your system. This is a build dependecy for the ccurl library.
- Build ccurl according to build
instructions
and put the
.so
library into thesrc
folder, or run theinit
script in the main folder to build and initialize:
$ ./init.sh
- Create a vitual environment / activate the one you use for PyOTA.
- Install th python package from source by running:
$ pip install -e .
Once installed, you can use the module to replace attach_to_tangle
core api call in PyOTA. Just import the ccurl_interface
module from
the pow
package and you are good to go.
An example code below illustrates how to do PoW for a bundle consisting of two transactions.
import iota from pprint import pprint from pow import ccurl_interface # Generate seed myseed = iota.crypto.types.Seed.random() # Generate two addresses addres_generator = iota.crypto.addresses.AddressGenerator(myseed) addys = addres_generator.get_addresses(1, count=2) # Preparing transactions pt = iota.ProposedTransaction(address = iota.Address(addys[0]), tag = iota.Tag(b'LOCALATTACHINTERFACE99999'), value = 0) pt2 = iota.ProposedTransaction(address = iota.Address(addys[1]), tag = iota.Tag(b'LOCALATTACHINTERFACE99999'), value = 0) # Preparing bundle that consists of both transactions prepared in the previous example pb = iota.ProposedBundle(transactions=[pt2,pt]) # Generate bundle hash pb.finalize() # Declare an api instance api = iota.Iota("https://nodes.thetangle.org:443") # Get tips to be approved by your bundle gta = api.get_transactions_to_approve(depth=3) minimum_weight_magnitude = 14 # target is mainnet # perform PoW locally bundle_trytes =\ ccurl_interface.attach_to_tangle( pb.as_tryte_strings(), gta['trunkTransaction'], gta['branchTransaction'], mwm ) # Broadcast transactions on the Tangle broadcasted = api.broadcast_and_store(bundle_trytes) bundle_broadcasted =iota.Bundle.from_tryte_strings(broadcasted['trytes']) pprint('Local pow broadcasted transactions are:') pprint(bundle_broadcasted.as_json_compatible())
Run nosetests
to test in current environment.
Run tox -v -p all
to test in Python 2.7, 3.5, 3.6 and 3.8.
Raise issues: https://github.com/iotaledger/ccurl.interface.py/issues