Skip to content

Latest commit

 

History

History
229 lines (181 loc) · 38.2 KB

File metadata and controls

229 lines (181 loc) · 38.2 KB

PandoraPay API

Summary of API

There are three types of API in order to interact with PandoraPay DAEMON

Binary data is passed using base64 not HEX! Passing GET arguments requires URLEncode.

  1. HTTP

    1. authentication
    2. wallet
    3. notifications

    Data is packed using json

  2. HTTP RPC

    1. authentication
    2. wallet
    3. notifications

    Data is packed using json

  3. HTTP Websockets

    1. authentication
    2. wallet
    3. notifications

    Data is packed using msgpack

List of API

List of all APIs

REST API Description HTTP GET HTTP POST JSON RPC HTTP Websocket Requires Auth Explanation
ping Ping/Pong ✓ ✗ ✓ ✓
"" (empty string) Node Info ✓ ✗ ✓ ✓
chain Blockchain summary ✓ ✗ ✓ ✓
blockchain alias for chain ✓ ✗ ✓ ✓
sync Sync Info ✓ ✗ ✓ ✓
block-hash Block hash from height ✓ ✗ ✓ ✓
block Block with Txs hashes only ✓ ✗ ✓ ✓
block-complete Block with Txs ✓ ✗ ✓ ✓
block-miss-txs Block with Txs that are not specified in a transaction list ✗ ✗ ✗ ✓ Used only for Consensus
tx-hash Tx hash from height ✓ ✗ ✓ ✓
tx Transaction ✓ ✗ ✓ ✓
tx-raw Transaction serialized ✓ ✗ ✓ ✓
account Account ✓ ✗ ✓ ✓
accounts/count Number of accounts for an asset ✓ ✗ ✓ ✓
accounts/keys-by-index Accounts Keys for an asset specified by a list of indexes ✓ ✗ ✓ ✓
accounts/keys Accounts for an asset specified by a list of Accounts Keys ✓ ✗ ✓ ✓
asset Asset ✓ ✗ ✓ ✓
asset/fee-liquidity Asset Fee Liquidity ✓ ✗ ✓ ✓
mempool List of Tx Hashes that are in the mempool ✓ ✗ ✓ ✓
mempool/tx-exists Existence of a Tx Hash in the mempool ✓ ✗ ✓ ✓
mempool/new-tx Validate, Include and Broadcast Tx ✓ ✗ ✓ ✓
mepool/new-tx-id Send a new txId to a node. In case the other node doesn't have this transaction in mempool, it will ask to download the transaction ✗ ✗ ✗ ✓
network/nodes List of peers (50% of most active nodes, 50% of random nodes) ✓ ✗ ✓ ✓
asset-info Shorter version of an Asset ✓ ✗ ✓ ✓ Requires --seed-wallet-nodes-info="true"
block-info Shorter version of a Block ✓ ✗ ✓ ✓ Requires --seed-wallet-nodes-info="true"
tx-info Shorter version of a Tx ✓ ✗ ✓ ✓ Requires --seed-wallet-nodes-info="true"
tx-preview Shorter version of a Tx ✓ ✗ ✓ ✓ Requires --seed-wallet-nodes-info="true"
account/txs Account transactions ✓ ✗ ✓ ✓ Requires --seed-wallet-nodes-info="true"
account/mempool Account pending transactions in mempool ✓ ✗ ✓ ✓ Requires --seed-wallet-nodes-info="true"
account/mempool-nonce Account new nonce from the mempool ✓ ✗ ✓ ✓ Requires --seed-wallet-nodes-info="true"
handshake Websocket Handshake ✗ ✗ ✗ ✓ Used only in websockets
get-chain Short information about Blockchain ✗ ✗ ✗ ✓ Used only for Consensus
chain-update Notify the node of a Blockchain Update ✗ ✗ ✗ ✓ Used only for Consensus
sub Subscribe for changes in Account, PlainAccount, AccountTransactions, Asset, Registration and Transaction. The node will send a notification if the subscribed data is changed ✗ ✗ ✗ ✓
unsub Unsubscribe from a change ✗ ✗ ✗ ✓
faucet/info Faucet information (hcaptcha) ✓ ✗ ✓ ✓ Requires --faucet-testnet-enabled="true"
faucet/coins Get Faucet coins ✓ ✗ ✓ ✓ Requires --faucet-testnet-enabled="true"
delegator-node/info Delegator Info ✓ ✗ ✓ ✓ Requires
delegator-node/ask Request ✓ ✗ ✓ ✓ Requires
login Login user by providing credentials ✗ ✗ ✗ ✓ Requires --auth-users
logout Logout user from connection ✗ ✗ ✗ ✓ ! Requires --auth-users
wallet/get-addresses Get all wallet accounts ✓ ✗ ✓ ✓ ! Requires --auth-users
wallet/create-address Create a new empty address ✓ ✗ ✓ ✓ ! Requires --auth-users
wallet/get-balances Get the balances (decrypted) of the requested wallet addresses ✓ ✗ ✓ ✓ ! It will load the balances and decrypt them. The decryption is a brute force algorithm that will check all balances until is found. Having an 8 decimal balance will take a few minutes! Requires --auth-users.
wallet/delete-address Delete an address from the wallet ✓ ✗ ✓ ✓ ! Requires --auth-users
wallet/decrypt-tx Decrypt a transaction using wallet ✓ ✗ ✓ ✓ ! Will decrypt zether transaction and return Recipient Ring Position (if you are the sender), shared decrypted message and decrypted amount using Whisper protocol. The decrypted tx amount is checked fast by verifying only that the whisper amounts are indeed the real values. In case the whisper amount is wrong, the call will return false and report the amount 0. Requires --auth-users
wallet/private-transfer Create a private Transfer ✗ ✓ ✓ ✓ ! It will create and broadcast a private transaction. Requires --auth-users

TODO: TCP

Enable Authentication

To Set users and enable authentication use argument --auth-users='[{"user": "username", "pass": "secret"}]'

Integration to a third party app

The best and the most efficient way is to use the PaymentID attribute and require the paymentIDs for each transaction. Instead of having a newly created address for every user or product/good, you should use a new PaymentID. By using this PaymentID, you can distinguish which user paid for which product/good was paid for. Your app should check all transactions, verify that something has really received and based on the paymentID to link and identify the user who paid for or the product/good that was paid for.

Examples of APIs

wallet/get-addresses

Request curl http://127.0.0.1:5230/wallet/get-addresses?user=username&pass=password

Output

{
    "version": 0,
    "encrypted": 0,
    "addresses": [ {
         "version": 0,
         "name": "Addr_0",
         "seedIndex": 0,
         "isMine": true,
         "privateKey": {
             "key": "gvn6DsTRPzkAjOKoqrgWmm8c86RTtvSt4Z823NZ1sXU="
         },
         "registration": "FvtvFvOZ3NfcFldESgM/gOmnAp4x+6pEUfe3cshwPXsMEX12hRaiZwcnTvWVwIT3USWC8A7k0yNZGDsaXLPozg==",
         "publicKey": "AnFArC/CIth67o3OJTm4OqqIgmWMsj6evaGGGDYeXrAB",
         "decryptedBalances": {
             "AAAAAAAAAAAAAAAAAAAAAAAAAAA=": {
                 "amount": 242927,                
                 "encryptedBalance": "FfgTaGSxwG6+2cA6AGphOG2dLJMxD/l1i306VYCkmm0AGLgixCwnrYTSlxVE10NBe7KP91MPhI6dUsI1mKZlsB0B",
             }
         },
         "addressEncoded": "PANDDEVAAJxQKwvwiLYeu6NziU5uDqqiIJljLI<nr2hhhg2Hl6wAQCT7qfa",
         "addressRegistrationEncoded": "PANDDEVAAJxQKwvwiLYeu6NziU5uDqqiIJljLI<nr2hhhg2Hl6wAQEKZR0gGenCYXf4jt<ZFx6<e7Nr0SIN9507FRvGT2jOIBGufNElj02S9aKZZ5G9FgmNN06oHjMgbiZRoYdW57NWvfkqfQ==",
         "delegatedStake": {
             "privateKey": {
                 "key": "MRDD4sm8istDv5MGhK3Jb/yD7TeVU57BBth1VGT+e4U="
             },
             "publicKey": "LO8j/CtyaJoeEySp2h6BCXL0JET5t/QKT//jlfTXGQMA",
             "lastKnownNonce": 0
         }
    }, ...
    ]
}

wallet/get-balances

Request Using PublicKey curl http://127.0.0.1:5230/wallet/get-balances?list.0.publicKey=EkgfeoxQYNAeDTR%2BXz85AG8mHEhsPYM8fFSslBsgO7EB&user=username&pass=password

OR

Request Using Address curl http://127.0.0.1:5230/wallet/get-balances?list.0.address=PANDDEVAAJxQKwvwiLYeu6NziU5uDqqiIJljLI<nr2hhhg2Hl6wAQCT7qfa&user=username&pass=password

Output

{
    "results":[{
            "address": "PANDDEVABc3D9FePUuPADupO1p8jvtwEAVG5L3>sDttvmCw><jgAAABpTAR",
            "plainAcc": null,
            "balances":[ {
                    "balance": "FfgTaGSxwG6+2cA6AGphOG2dLJMxD/l1i306VYCkmm0AGLgixCwnrYTSlxVE10NBe7KP91MPhI6dUsI1mKZlsB0B",
                    "amount": 65205984,
                    "asset": "AAAAAAAAAAAAAAAAAAAAAAAAAAA="
                }
            ]
        }
    ]
}

balance is the ElGamal encrypted balance

amount is the decrypted value.

WARNING! The decryptor is a making brute force trying all possible balances starting from 0. If you have more than 8 decimals values, it could take even a few minutes to decrypt the balance is case it was changed.

wallet/decrypt-tx

Request Using TxHash curl http://127.0.0.1:5230/wallet/decrypt-tx?hash=dKTfcDJ4gRcV1Rx5ZFtXxsrh2YwlaljDLast5g3f1rY%3D&user=username&pass=password

Output

{
   "decrypted":{
      "type":1,
      "zetherTx":{
         "payloads":[ {
               "whisperSenderValid":true,
               "sentAmount":100703740,
               "whisperRecipientValid":false,
               "receivedAmount":0,
               "recipientIndex":9,
               "message":"VGVzdG5ldCBGYXVjZXQgVHg="
            }
         ]
      }
   }
}

whisperSenderValid true if you were the sender and the whisper encrypted amount was successfully verified.

sentAmount amount if you were the sender and the whisper encrypted amount was successfully verified.

recipientIndex ring member position of the recipient if you were the sender

whisperRecipientValid true if you were the recipient and the whisper encrypted amount was successfully verified.

receivedAmount amount if you were the recipient and the whisper encrypted amount was successfully verified.

message decrypted shared messaged

In case the whisper is malformed it will return accordingly.

wallet/private-transfer

Creating private transfer using a POST request like the following:

curl -X POST  \
-H 'Content-Type: application/json'  \
-d '{ "user": "username", "pass": "password", "data": { "payloads": [ {"sender":  "PANDDEVAAaBVqiVyecV\u003cysBwcT\u003cGRkIHPBdbHZ9hwaS4wfV4xKYAQAPLjdy",  "recipient":  "PANDDEVABjp7xeB<oGlMe5PdvIq7oGhUq3iquvERZS3<Ax6CCzqAABnVMdN",  "amount": 100 }] }, "propagate": true }' http://127.0.0.1:5232/wallet/private-transfer

WARNING! When creating a private transfer, the balance must be decrypted for signing. The decryptor is a making brute force trying all possible balances starting from 0. If you have more than 8 decimals values, it could take even a few minutes to decrypt the balance is case it was changed.

DISCLAIMER:

This source code is released for research purposes only, with the intent of researching and studying a decentralized p2p network protocol.

PANDORAPAY IS AN OPEN SOURCE COMMUNITY DRIVEN RESEARCH PROJECT. THIS IS RESEARCH CODE PROVIDED TO YOU "AS IS" WITH NO WARRANTIES OF CORRECTNESS. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES. USE AT YOUR OWN RISK.

You may not use this source code for any illegal or unethical purpose; including activities which would give rise to criminal or civil liability.

Under no event shall the Licensor be responsible for the activities, or any misdeeds, conducted by the Licensee.