Mastering Monero
  • 介绍
  • 前言
  • 快速术语检索
  • 介绍
    • 环签名
    • 隐藏地址
    • 环机密交易
    • 密钥镜像
    • 范围证明
  • 门罗币的原理
  • 门罗币客户端
  • 密钥、地址、钱包
    • 普通地址
    • 子地址
    • 多重签名地址
  • 交易
  • 门罗币网络
  • 区块链
  • 挖矿与共识
    • 算法介绍
    • 算法背景
    • 挖矿软件
    • 矿池
  • 门罗币安全
    • 升级机制
  • CryptoNote
    • Features
    • Inside
    • Wiki
    • whitepaper
  • 附录
  • 数据存储
  • 助记词
  • 数据结构
    • 区块链
    • 账号、钱包、地址
    • 底层
    • 其它
  • 有问有答
  • 硬件钱包
Powered by GitBook
On this page
  • block
  • block_header
  • transaction
  • transaction_prefix
  • txin_v
  • tx_out
  • inputs
  • txout_target_v
  • outputs
  • cryptonote

Was this helpful?

  1. 数据结构

区块链

block

  struct block: public block_header
  {
  private:
    // hash cash
    mutable std::atomic<bool> hash_valid;

  public:
    transaction miner_tx;
    std::vector<crypto::hash> tx_hashes;

    // hash cash
    mutable crypto::hash hash;
  };

block_header

  struct block_header
  {
    uint8_t major_version;
    uint8_t minor_version;  // now used as a voting mechanism, rather than how this particular block is built
    uint64_t timestamp;
    crypto::hash  prev_id;
    uint32_t nonce;
  };

transaction

  class transaction: public transaction_prefix
  {
  private:
    // hash cash
    mutable std::atomic<bool> hash_valid;
    mutable std::atomic<bool> blob_size_valid;

  public:
    std::vector<std::vector<crypto::signature> > signatures; //count signatures  always the same as inputs count
    rct::rctSig rct_signatures;

    // hash cash
    mutable crypto::hash hash;
    mutable size_t blob_size;
  };

transaction_prefix

  class transaction_prefix
  {

  public:
    // tx information
    size_t   version;
    uint64_t unlock_time;  //number of block (or time), used as a limitation like: spend this tx not early then block/time

    std::vector<txin_v> vin;
    std::vector<tx_out> vout;
    //extra
    std::vector<uint8_t> extra;
  };

txin_v

typedef boost::variant<txin_gen, txin_to_script, txin_to_scripthash, txin_to_key> txin_v;

tx_out

  struct tx_out
  {
    uint64_t amount;
    txout_target_v target;
  };

inputs

  struct txin_gen
  {
    size_t height;
  };

  struct txin_to_script
  {
    crypto::hash prev;
    size_t prevout;
    std::vector<uint8_t> sigset;
  };

  struct txin_to_scripthash
  {
    crypto::hash prev;
    size_t prevout;
    txout_to_script script;
    std::vector<uint8_t> sigset;
  };

  struct txin_to_key
  {
    uint64_t amount;
    std::vector<uint64_t> key_offsets;
    crypto::key_image k_image;      // double spending protection
  };

txout_target_v

typedef boost::variant<txout_to_script, txout_to_scripthash, txout_to_key> txout_target_v;

outputs

  struct txout_to_script
  {
    std::vector<crypto::public_key> keys;
    std::vector<uint8_t> script;
  };

  struct txout_to_scripthash
  {
    crypto::hash hash;
  };

  struct txout_to_key
  {
    crypto::public_key key;
  };
namespace cryptonote
{
  struct tx_extra_padding
  {
    size_t size;
  };

  struct tx_extra_pub_key
  {
    crypto::public_key pub_key;
  };

  struct tx_extra_nonce
  {
    std::string nonce;
  };

  struct tx_extra_merge_mining_tag
  {
    struct serialize_helper
    {
      tx_extra_merge_mining_tag& mm_tag;
    };

    size_t depth;
    crypto::hash merkle_root;
  };

  // per-output additional tx pubkey for multi-destination transfers involving at least one subaddress
  struct tx_extra_additional_pub_keys
  {
    std::vector<crypto::public_key> data;
  };

  struct tx_extra_mysterious_minergate
  {
    std::string data;
  };

  // tx_extra_field format, except tx_extra_padding and tx_extra_pub_key:
  //   varint tag;
  //   varint size;
  //   varint data[];
  typedef boost::variant<tx_extra_padding, tx_extra_pub_key, tx_extra_nonce, tx_extra_merge_mining_tag, tx_extra_additional_pub_keys, tx_extra_mysterious_minergate> tx_extra_field;
}
  struct tx_source_entry
  {
    typedef std::pair<uint64_t, rct::ctkey> output_entry;

    std::vector<output_entry> outputs;  //index + key + optional ringct commitment
    size_t real_output;                 //index in outputs vector of real output_entry
    crypto::public_key real_out_tx_key; //incoming real tx public key
    std::vector<crypto::public_key> real_out_additional_tx_keys; //incoming real tx additional public keys
    size_t real_output_in_tx_index;     //index in transaction outputs vector
    uint64_t amount;                    //money
    bool rct;                           //true if the output is rct
    rct::key mask;                      //ringct amount mask
    rct::multisig_kLRki multisig_kLRki; //multisig info
  };

  struct tx_destination_entry
  {
    uint64_t amount;                    //money
    account_public_address addr;        //destination address
    bool is_subaddress;
  };

cryptonote

/** a pair of <transaction hash, output index>, typedef for convenience */
typedef std::pair<crypto::hash, uint64_t> tx_out_index;
struct output_data_t
{
  crypto::public_key pubkey;       //!< the output's public key (for spend verification)
  uint64_t           unlock_time;  //!< the output's unlock time (or height)
  uint64_t           height;       //!< the height of the block which created the output
  rct::key           commitment;   //!< the output's amount commitment (for spend verification)
};

struct tx_data_t
{
  uint64_t tx_id;
  uint64_t unlock_time;
  uint64_t block_id;
};

struct txpool_tx_meta_t
{
  crypto::hash max_used_block_id;
  crypto::hash last_failed_id;
  uint64_t blob_size;
  uint64_t fee;
  uint64_t max_used_block_height;
  uint64_t last_failed_height;
  uint64_t receive_time;
  uint64_t last_relayed_time;
  // 112 bytes
  uint8_t kept_by_block;
  uint8_t relayed;
  uint8_t do_not_relay;
  uint8_t double_spend_seen: 1;

  uint8_t padding[76]; // till 192 bytes
};
Previous数据结构Next账号、钱包、地址

Last updated 5 years ago

Was this helpful?