Let’s assume n4D7ndiC4yLZxhAf726uMHXC914sEuUAcg wants to send n1fseuMLWaKDnDkpXiz8PpwV8RqYna9Mbf one unit of his asset A1517414400000000000.
source: n4D7ndiC4yLZxhAf726uMHXC914sEuUAcgdestination: n1fseuMLWaKDnDkpXiz8PpwV8RqYna9Mbfasset: A1517414400000000000quantity: 1
NOTE:
- This example uses Counterparty and Bitcoin testnet
- On mainnet the procedure is the same, but for brevity this particle will omit testnet-related notes. In practice:
- Command line: use
testnet=1in your counterparty server or--testnetincounterparty-clientcommands if there is no separate configuration file for testnet (in which case you need to use--config=/my/testnet.confinstead). The same goes for Bitcoin Core - if working on testnet, add-testnet(single dash) to your commands! - Counterparty API: use the testnet port (by default 14000).
- Remember to use
--unconfirmedor equivalent in the API if you don’t want to wait until transactions get confirmed - A testnet explorer for Counterparty can be found at https://testnet.counterpartychain.io
###Counterparty: Create Send Transaction
Source creates a send transaction in Counterwallet, counterparty-client or encodes it manually. This post contains many details about encoding and decoding used by Counterparty.
Using the Counterparty API create_send, this is how this send request would look like:
{
"method": "create_send",
"params": {"source": "n4D7ndiC4yLZxhAf726uMHXC914sEuUAcg", "destination": "n1fseuMLWaKDnDkpXiz8PpwV8RqYna9Mbf", "asset": "A1517414400000000000", "quantity": 1},
"jsonrpc": "2.0",
"id": 1
}
You could send this to the public API server with curl.
The response is a raw Bitcoin transaction with a Counterparty payload embedded in it.
{
"result": "0100000001dac40b1e6f17b03bc44cd1a111fd0e4ceadc0c9279e44f7d5e16eaffe00bd9af020000001976a914f8eb547223b286af4c069845bab650951de0ba8988acffffffff0336150000000000001976a914dd1262b79cba636a0366790369d8442f2b7fba0688ac00000000000000001e6a1c1efa288c60bfb2614d69e7b251d602bf9fdb04f2af6fd3cddb9bcc4da9c73200000000001976a914f8eb547223b286af4c069845bab650951de0ba8988ac00000000",
"id": 1,
"jsonrpc": "2.0"
}
That’s all there is to it on the Counterparty platform. The rest is all Bitcoin.
###Bitcoin: Sign and Send (Broadcast) a Transaction
Source (address) needs to sign this raw transaction and broadcast it to the (bitcoin) network. As mentioned in the official API documentation, the Counterparty API does not duplicate this functionality present in many Bitcoin applications and APIs.
Using Bitcoin Core (reminder: -testnet is omitted in these examples):
$ bitcoin-cli signrawtransaction "0100000001dac40b1e6f17b03bc44cd1a111fd0e4ceadc0c9279e44f7d5e16eaffe00bd9af020000001976a914f8eb547223b286af4c069845bab650951de0ba8988acffffffff0336150000000000001976a914dd1262b79cba636a0366790369d8442f2b7fba0688ac00000000000000001e6a1c1efa288c60bfb2614d69e7b251d602bf9fdb04f2af6fd3cddb9bcc4da9c73200000000001976a914f8eb547223b286af4c069845bab650951de0ba8988ac00000000"
And the result of that is a signed transaction:
{
"hex": "0100000001dac40b1e6f17b03bc44cd1a111fd0e4ceadc0c9279e44f7d5e16eaffe00bd9af020000006b483045022100cc36660656cfa3f30373cd76abc1ba3e0288a0a267f5109263140aabf56328b0022017a95d56a528630d861d72d306dbf982e1f6c095fd72ef685110f2f3f059032701210265f9763ea8f857571a003a9c7abddc9875a3dd921dbdb15c1659944869f945cdffffffff0336150000000000001976a914dd1262b79cba636a0366790369d8442f2b7fba0688ac00000000000000001e6a1c1efa288c60bfb2614d69e7b251d602bf9fdb04f2af6fd3cddb9bcc4da9c73200000000001976a914f8eb547223b286af4c069845bab650951de0ba8988ac00000000",
"complete": true
}
Now we just need to broadcast that using the Bitcoin Core’s sendrawtransaction command:.
$ bitcoin-cli sendrawtransaction "<long-hex-thing-from-above>"
a7a1714bb71058d6ce6e198dabc33643fb94ed669643409aad21ecfc5c658dff
We get back a Bitcon transaction ID. In counterparty-server you’d see something similar:
2016-10-27-T18:59:08+0800 [INFO] Send: 1 A1517414400000000000 from n4D7ndiC4yLZxhAf726uMHXC914sEuUAcg to n1fseuMLWaKDnDkpXiz8PpwV8RqYna9Mbf
(a7a1714bb71058d6ce6e198dabc33643fb94ed669643409aad21ecfc5c658dff) [valid]
To obtain information about this transaction immediately, we specify --unconfirmed and provide the raw transaction ID using get_tx_info action.
Using counterparty-client - because our instance Bitcoin Core has addrindex (see What is addrindex and why is it necessary?) - we can look up BTC and Counterparty balances of any address.
To see if destination address received our asset we would use the balances command in counterparty-client.
balances n1fseuMLWaKDnDkpXiz8PpwV8RqYna9Mbf
Or, using the Counterparty API (also on testnet):
{
"method": "get_balances",
"params": {
"filters": [{"field": "asset", "op": "==", "value": "A1517414400000000000"}, {"field": "address", "op": "==", "value": "n1fseuMLWaKDnDkpXiz8PpwV8RqYna9Mbf"}],
"filterop": "and" },
"jsonrpc": "2.0",
"id": 1
}
Response:
{
"result": [
{
"asset": "A1517414400000000000",
"quantity": 1,
"address": "n1fseuMLWaKDnDkpXiz8PpwV8RqYna9Mbf"
}
],
"id": 1,
"jsonrpc": "2.0"
}
Keywords: create_send, api, send