Author Topic: Help me craft a raw transaction  (Read 1858 times)

0 Members and 1 Guest are viewing this topic.

Offline bytemaster

For the latest updates checkout my blog: http://bytemaster.bitshares.org
Anything said on these forums does not constitute an intent to create a legal obligation or contract between myself and anyone else.   These are merely my opinions and I reserve the right to change them at any time.

Offline ElMato

  • Sr. Member
  • ****
  • Posts: 288
    • View Profile
It would be great if we can have our own blockcypher.com (or chain.com) or ask them to integrate bitshares.

I managed to create and broadcast a raw transaction using the code below.

Please give me some directions:

1) Who do i track records ids of accounts that are not in the wallet db? (read only accounts)
    Should i export the wallet to json and add a new account_record_type?

Code: [Select]
#include <iostream>
#include <vector>
#include <bts/blockchain/transaction.hpp>
#include <fc/crypto/elliptic.hpp>
#include <fc/io/json.hpp>
#include <fc/crypto/hex.hpp>
#include <bts/utilities/key_conversion.hpp>

using namespace bts::blockchain;
using namespace bts::utilities;

int main(int argc, char** argv)
{
  const std::string tx_json = R"(
  {
      "expiration": "20141028T085151",
      "delegate_slate_id": null,
      "operations": [{
          "type": "register_account_op_type",
          "data": {
            "name": "justtesting",
            "public_data": null,
            "owner_key": "BTSX6yNA6Kc1qYSUt1ppFe8oPKcnWGHCg11VLKTY36V9jfyQvswjdh",
            "active_key": "BTSX6yNA6Kc1qYSUt1ppFe8oPKcnWGHCg11VLKTY36V9jfyQvswjdh",
            "delegate_pay_rate": 255,
            "meta_data": {
              "type": "public_account",
              "data": ""
            }
          }
        },{
          "type": "withdraw_op_type",
          "data": {
            "balance_id": "BTSX6nhkTeg1qnBbCHtJ4q8GUrBU9Sq2fTS23",
            "amount": 50,
            "claim_input_data": ""
          }
        }
      ]
  }
  )";

  auto tx = fc::json::from_string(tx_json).as<signed_transaction>();

  auto priv = wif_to_key("[edited]");

  fc::sha256 chain_id;
  fc::from_variant("75c11a81b7670bbaa721cc603eadb2313756f94a3bcbb9928e9101432701ac5f", chain_id);

  auto signature = priv->sign_compact( tx.digest(chain_id) );

  tx.signatures.push_back(signature);

  std::cout << fc::json::to_pretty_string(tx) << std::endl;

  vector<char> data;
  data = fc::raw::pack(tx);

  std::cout << fc::to_hex(data) << std::endl;
 


  return 0;
}

Offline bytemaster

We will need to add an RPC call that will create a raw transaction... and return the hash of the raw transaction and list of required signatures for the purposes of signing.

The signature must be on the full transaction.
For the latest updates checkout my blog: http://bytemaster.bitshares.org
Anything said on these forums does not constitute an intent to create a legal obligation or contract between myself and anyone else.   These are merely my opinions and I reserve the right to change them at any time.

Offline ElMato

  • Sr. Member
  • ****
  • Posts: 288
    • View Profile
BM, thanks for your response.

Just let me know if I am on the right track.

wallet_account_balance_ids account
returns the complete "UTXO" set for the account?

Then i can use the balance ids to make this ...

Quote
{
  "trx": {
    "expiration": "20141027T205151",
    "delegate_slate_id": null,
    "operations": [{
        "type": "register_account_op_type",
        "data": {
          "name": "[put a name here]",
          "public_data": null,
          "owner_key": "[Public Key BTSX format]",
          "active_key": "[Public Key BTSX format]",
          "delegate_pay_rate": 255,
          "meta_data": {
            "type": "public_account",
            "data": ""
          }
        }
      },{
        "type": "withdraw_op_type",
        "data": {
          "balance_id": "[Balance Record ID]",
          "amount": 50000,
          "claim_input_data": ""
        }
      }
    ],
    "signatures": [
"[Signature for the withdraw]"
    ]
  }
}

Questions:

0) Is the above Json enough?

1) How is the signature generated ?
    (required_signatures adds balance_record.owner() but i can't figure what is signing)

2) How do i go from Json -> Hex? Is there any "createrawtransaction"?



Offline bytemaster

Balance records are modified in place, but if you want a change address you can withdraw the whole balance and send to two new balances.

It would probably be easier to construct custom transactions in JSON format and then ask the C++ to serialize them. 
For the latest updates checkout my blog: http://bytemaster.bitshares.org
Anything said on these forums does not constitute an intent to create a legal obligation or contract between myself and anyone else.   These are merely my opinions and I reserve the right to change them at any time.

Offline ElMato

  • Sr. Member
  • ****
  • Posts: 288
    • View Profile
I know that devs are involved in more important things, but it would be really helpful to have a simple example of how to create two types of raw transactions.

1) Account register.
2) Asset transfer.

Number one is useful when i want to register an account on behalf of other person. (ie: Mobile Client signup process)
We will create the private keys like wallet_account_create does.

So far, this is what i have diving into the source code.

uint32_t utc_seconds;
uint64_t delegate_slate_id;
VARINT  n_ops; (number of ops)
-- register account operation
uint8_t                 operation_type
VARINT                  name_length
char[name_length]       name
VARIANT                   public_data  (json string serialized as VARIANT?)
uint8_t[33]             owner_key
uint8_t[33]             active_key
uint8_t                 delegate_pay_rate
uint32_t                account_type
VARINT                  data_length
char[data_length]       data

--- withdraw operations
....
-- signatures
....

is this ok?


Then i have to provide the signatures of the spent record ids (from the pay account) that pays for the transaction fee.
For this i need to know the blockchain format.

I remember that drltc was working on this, is there any documentation to look?

Other questions:
Do we have an equivalent of change addresses in bitshares?
Or balance records are modified "in place"?

Do we have any tool in python/ruby to read the blockchain and extract information?