All Projects → FactomProject → factom-api

FactomProject / factom-api

Licence: MIT license
Python client library for the Factom API

Programming Languages

python
139335 projects - #7 most used programming language
Makefile
30231 projects
Dockerfile
14818 projects

Projects that are alternatives of or similar to factom-api

factomjs
Javascript library to build applications on the Factom blockchain.
Stars: ✭ 23 (+9.52%)
Mutual labels:  factoids, factom
PassEncoder
Simple PassKit (Apple Wallet) encoding and signing in Swift.
Stars: ✭ 28 (+33.33%)
Mutual labels:  wallet
poketto-ios
📱👛 xDai Mobile Wallet for iOS
Stars: ✭ 19 (-9.52%)
Mutual labels:  wallet
FranklinPay-iOS
Secure Dollar Wallet
Stars: ✭ 35 (+66.67%)
Mutual labels:  wallet
argent-x
ArgentX browser extension for StarkNet - made with ❤️ by Argent
Stars: ✭ 419 (+1895.24%)
Mutual labels:  wallet
BitBlocks old
BitBlocks Project_OLD
Stars: ✭ 12 (-42.86%)
Mutual labels:  wallet
Ledger Live Mobile
Ledger Live (Mobile)
Stars: ✭ 235 (+1019.05%)
Mutual labels:  wallet
alias-wallet
Official Alias source code repository
Stars: ✭ 5 (-76.19%)
Mutual labels:  wallet
conceal-desktop
Conceal Desktop (GUI)
Stars: ✭ 65 (+209.52%)
Mutual labels:  wallet
mixin-wallet
👛 An open-source cryptocurrency wallet bot based on Mixin API, which supports almost all popular cryptocurrencies.
Stars: ✭ 27 (+28.57%)
Mutual labels:  wallet
keycard-cli
A command line tool and shell to manage keycards
Stars: ✭ 42 (+100%)
Mutual labels:  wallet
walletconnect-test-wallet
Test Wallet (Web)
Stars: ✭ 163 (+676.19%)
Mutual labels:  wallet
hd-address
An extensible HD Wallet Address management utility
Stars: ✭ 22 (+4.76%)
Mutual labels:  wallet
ETH Wallet Kotlin
(Deprecated) 不再维护,新项目参考https://github.com/snailflying/ETHWallet
Stars: ✭ 20 (-4.76%)
Mutual labels:  wallet
hathor-wallet-mobile
Hathor official mobile wallet
Stars: ✭ 18 (-14.29%)
Mutual labels:  wallet
QWallet
Blockchain Wallet for Coin & ERC20 Tokens
Stars: ✭ 11 (-47.62%)
Mutual labels:  wallet
gonano
An implementation of the Nano cryptocurrency in Go
Stars: ✭ 34 (+61.9%)
Mutual labels:  wallet
paper-wallet
The official Paper Wallet for the ARK Blockchain.
Stars: ✭ 22 (+4.76%)
Mutual labels:  wallet
piWallet
No description or website provided.
Stars: ✭ 17 (-19.05%)
Mutual labels:  wallet
wallet
Cross chain browser wallet extension
Stars: ✭ 79 (+276.19%)
Mutual labels:  wallet

factom-api

CircleCI PyPI

This library provides Python clients for interacting with the factomd and factom-walletd APIs. While not all API methods have been implemented yet, you'll find most of what you need to build a working application are available, along with shortcut methods for accomplishing common tasks involving multiple calls between the wallet and daemon.

This API client (from version 1.2 onwards) supports Python 3.5 and higher.

If you're unfamiliar with Factom, I encourage you to read the documentation, especially the white paper. In a nutshell, Factom provides a layer on top of the Bitcoin blockchain making it possible to secure data faster and in larger amounts than the Bitcoin network would allow alone.

Getting started

Installing the API client

The easiest way to install is directly from pip:

$ pip install factom-api

Usage

I'll go over a few common operations here you'll most likely use in applications. In general you'll need instances of both the wallet and factomd clients to build and submit transactions. To build new clients:

from factom import Factomd, FactomWalletd

# Default settings
factomd = Factomd()
walletd = FactomWalletd()

# You can also specify default fct and ec addresses, change host, or specify RPC credentials, for example:
fct_address = 'FA2jK2HcLnRdS94dEcU27rF3meoJfpUcZPSinpb7AwQvPRY6RL1Q'
ec_address = 'EC2jhmCtabeTXGtuLi3AaPzvwSuqksdVsjfxXMXV5gPmipXc4GjC'

factomd = Factomd(
    host='http://someotherhost:8088',
    fct_address=fct_address,
    ec_address=ec_address,
    username='rpc_username',
    password='rpc_password'
)

Transacting factoids to factoids

First let's query the balance in both of our fct addresses:

>>> fct_address1 = 'FA2jK2HcLnRdS94dEcU27rF3meoJfpUcZPSinpb7AwQvPRY6RL1Q'
>>> fct_address2 = 'FA3TMQHrCrmLa4F9t442U3Ab3R9sM1gThYMDoygPEVtxrbHtFRtg'
>>> ec_address = 'EC2jhmCtabeTXGtuLi3AaPzvwSuqksdVsjfxXMXV5gPmipXc4GjC'

# Initialize the two clients
>>> factomd = Factomd()
>>> walletd = FactomWalletd()

# Query the balance in our first address. There should be a large amount
>>> factomd.factoid_balance(fct_address1)
{'balance': 1999999735950}

# The second address should be empty.
>>> factomd.factoid_balance(fct_address2)
{'balance': 0}

The wallet client provides a shorcut method fct_to_fct() which performs all the API calls needed to submit a simple fct to fct transaction. This includes adding inputs and outputs, calculating the fee, building the signed transaction, and submitting it to the network.

>>> walletd.fct_to_fct(factomd, 50000, fct_to=fct_address2, fct_from=fct_address1)
{'message': 'Successfully submitted the transaction', 'txid': 'a4d641f13d82b1d1682549d44fa41c7e1b01f1a16f8cbddb5c695df53fcebfd7'}

The server reports the transaction was submitted and if we wait a few seconds we can see the results:

>>> factomd.factoid_balance(fct_address2)
{'balance': 50000}

Converting factoids to entry credits

Our new entry credit address should have a balance of zero:

>>> factomd.entry_credit_balance(ec_address)
{'balance': 0}

First, we need to ask for the conversion rate:

>>> factomd.entry_credit_rate()
{'rate': 1000}

This tells us we'll need to burn 1000 factoids in exchange for 1 entry credit, so let's purchase 50 entry credits for 50000 factoids. Similar to fct_to_fct(), the wallet client also provides a fct_to_ec() shortcut for building and submitting simple fct conversion transactions.

>>> walletd.fct_to_ec(factomd, 50000, fct_address=fct_address1, ec_address=ec_address)
{'message': 'Successfully submitted the transaction', 'txid': 'd70b14ce05a21dbf772d1894383694b4537e17454915fc42dc20f02c1e0e2df2'}

And if we query our entry credit balance we see the conversion has happened:

>>> factomd.entry_credit_balance(ec_address)
{'balance': 50}

Writing chains and entries

The real meat and potatoes is the ability to easily read from and write data to the blockchain. Let's write some test data. The wallet client provides a new_chain() shortcut method that handles the API calls and encoding needed for creating a new chain. You could also build the transaction manually if you'd like more control over each step, but for most cases this is going to be easier.

>>> walletd.new_chain(factomd, ['random', 'chain', 'id'], 'chain_content', ec_address=ec_address)
{'message': 'Entry Reveal Success', 'entryhash': 'f9662a4675f4bb6566337eafd8237ab9fd2ba396947dadeb677c0526d367a5ce', 'chainid': 'da2ffed0ae7b33acc718089edc0f1d001289857cc27a49b6bc4dd22fac971495'}

If we wait a few minutes and search for the chain ID in the explorer we can see our initial entry:

Our new chain

Now let's add another entry to the same chain:

>>> chain_id = 'da2ffed0ae7b33acc718089edc0f1d001289857cc27a49b6bc4dd22fac971495'
>>> walletd.new_entry(factomd, chain_id, ['random', 'entry', 'id'], 'entry_content', ec_address=ec_address)
{'message': 'Entry Reveal Success', 'entryhash': '96f0472c9ec8a76c861fb4df37beb742938f41bbe492dc04893337bf387b83c5', 'chainid': 'da2ffed0ae7b33acc718089edc0f1d001289857cc27a49b6bc4dd22fac971495'}

You should see the new entry appear shortly.

Reading entries

If the entries in your chain reference each other, you may want to scan the entire chain in order to verify its integrity. The factomd client provides a read_chain() method which iterates over all entry-containing blocks and returns a list of entries in reverse order.

>>> chain_id = 'da2ffed0ae7b33acc718089edc0f1d001289857cc27a49b6bc4dd22fac971495'
>>> factomd.read_chain(chain_id)
[{'chainid': 'da2ffed0ae7b33acc718089edc0f1d001289857cc27a49b6bc4dd22fac971495', 'extids': ['random', 'entry', 'id'], 'content': 'entry_content'}, {'chainid': 'da2ffed0ae7b33acc718089edc0f1d001289857cc27a49b6bc4dd22fac971495', 'extids': ['random', 'chain', 'id'], 'content': 'chain_content'}]

You can see the two entries we created earlier.

Error handling

When things go badly, API methods will raise a factom.exceptions.FactomAPIError with details about the error.

>>> walletd.new_chain(factomd, ['random', 'chain', 'id'], 'chain_content', ec_address=ec_address)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/src/factom/client.py", line 196, in new_chain
    'ecpub': ec_address or self.ec_address
  File "/src/factom/client.py", line 56, in _request
    handle_error_response(resp)
  File "/src/factom/exceptions.py", line 18, in handle_error_response
    raise codes[code](message=message, code=code, data=data, response=resp)
factom.exceptions.InvalidParams: -32602: Invalid params

More data about the error is attached to the exception instance:

>>> try:
...     walletd.new_chain(factomd, ['random', 'chain', 'id'], 'chain_content', ec_address=ec_address)
... except FactomAPIError as e:
...     print(e.data)
...
Chain da2ffed0ae7b33acc718089edc0f1d001289857cc27a49b6bc4dd22fac971495 already exists

If you'd like to catch more specific errors, there are exception subclasses for the different error codes returned by the APIs. See factom/exceptions.py for a list.

Listening to LiveFeed

The LiveFeed in factomd pipes out data corresponding to various network events and pieces of work that were accomplished, such as processing an entry or sealing a directory block. The factom.livefeed.LiveFeedShovel class listens to the LiveFeed and handles that data in some way. As an example, if you had JSON output turned on for the LiveFeed:

import logging
import time
from factom.livefeed.listener import LiveFeedListener


def log_event(event_payload: bytes):
    logging.info(f"Event: {event_payload.decode()}")


listener = LiveFeedListener(handle=log_event)

while True:
    try:
        listener.run()
    except ConnectionResetError:
        logging.warning("Connection reset by peer. Sleeping 5 seconds and restarting...")
        time.sleep(5)
    except KeyboardInterrupt:
        logging.info("KeyboardInterrupt received, shutting down...")
        break
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].