门罗币的交易,块结构

块头

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;  //上个块的ID
    uint32_t nonce;         //nonce

    //序列化
    BEGIN_SERIALIZE()
      VARINT_FIELD(major_version)
      VARINT_FIELD(minor_version)
      VARINT_FIELD(timestamp)
      FIELD(prev_id)
      FIELD(nonce)
    END_SERIALIZE()
  };

主要有5个字段;版本号,次要版本号(现在用来做投票机制),时间戳,上个块的哈希,nonce;

区块

struct block: public block_header
  {
  private:
    mutable std::atomic hash_valid;       //块的状态,标识该块是否已被验证为有效。
    transaction miner_tx;   //coinbase交易
    std::vector tx_hashes;    //存储块中所有交易的哈希
    mutable crypto::hash hash;      //块的哈希

    BEGIN_SERIALIZE_OBJECT()
      if (!typename Archive::is_saving())
        set_hash_valid(false);

      FIELDS(*static_cast(this))
      FIELD(miner_tx)
      FIELD(tx_hashes)
    END_SERIALIZE()
  };

交易

交易输出类型:
typedef boost::variant txout_target_v;

// 交易输出
  typedef boost::variant txout_target_v;

  //typedef std::pair out_t;
  struct tx_out
  {
    uint64_t amount;        //交易输出的金额
    txout_target_v target;  //锁定脚本的类型

    BEGIN_SERIALIZE_OBJECT()
      VARINT_FIELD(amount)
      FIELD(target)
    END_SERIALIZE()
  };

交易输出总共3中类型:txout_to_script,txout_to_scripthash,txout_to_key;
交易的输出包含两个字段:
> * 输出金额
> * 锁定脚本

txout_to_script 类型

struct txout_to_script
{
    std::vector keys;
    std::vector script;

    BEGIN_SERIALIZE_OBJECT()
      FIELD(keys)
      FIELD(script)
    END_SERIALIZE()
};

txout_to_script类型的锁定脚本包含两个字段:公钥集合,脚本;

txout_to_scripthash 类型

struct txout_to_scripthash
{
    crypto::hash hash;
};

txout_to_scripthash类型的锁定脚本包含一个字段:哈希。

txout_to_key 类型

struct txout_to_key
{
    txout_to_key() { }
    txout_to_key(const crypto::public_key &_key) : key(_key) { }
    crypto::public_key key;
};

txout_to_key类型的锁定脚本包含一个字段:公钥。

交易输入类型:

typedef boost::variant txin_v;
交易输入总共分为4种类型:txin_gen,txin_txo_script,txin_to_scripthash,txin_to_key

txin_gen输入类型

struct txin_gen
{
    size_t height;
    BEGIN_SERIALIZE_OBJECT()
      VARINT_FIELD(height)
    END_SERIALIZE()
};

txin_gen:包含一个字段:高度

txin_txo_script类型

struct txin_to_script
{
    crypto::hash prev;
    size_t prevout;
    std::vector sigset;

    BEGIN_SERIALIZE_OBJECT()
      FIELD(prev)
      VARINT_FIELD(prevout)
      FIELD(sigset)
    END_SERIALIZE()
};

txin_to_script包含三个字段:引用交易的哈希,引用交易的输出索引,签名。

txin_to_scripthash类型

struct txin_to_scripthash
{
    crypto::hash prev;
    size_t prevout;
    txout_to_script script;
    std::vector sigset;

    BEGIN_SERIALIZE_OBJECT()
      FIELD(prev)
      VARINT_FIELD(prevout)
      FIELD(script)
      FIELD(sigset)
    END_SERIALIZE()
};

txin_to_scripthash包含4个字段:引用交易的哈希,引用交易的输出索引,引用输出的脚本,签名。

txin_to_key类型

struct txin_to_key
{
    uint64_t amount;
    std::vector key_offsets;
    crypto::key_image k_image;      // double spending protection   双花保护

    BEGIN_SERIALIZE_OBJECT()
      VARINT_FIELD(amount)
      FIELD(key_offsets)
      FIELD(k_image)
    END_SERIALIZE()
};

txin_to_key包含3个字段:

交易结构

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 vin;        //交易输入;注意集合中的元素为boost::variant 类型。
    std::vector vout;   //交易输出,元素为结构体。
    //extra
    std::vector extra; //额外的数据

    BEGIN_SERIALIZE()
      VARINT_FIELD(version)
      if(version == 0 || CURRENT_TRANSACTION_VERSION < version) return false;
      VARINT_FIELD(unlock_time)
      FIELD(vin)
      FIELD(vout)
      FIELD(extra)
    END_SERIALIZE()

  public:
    transaction_prefix(){}
};

一个交易的完整结构;包含5个字段。

  • 版本,锁定时间,交易输入,交易输出,额外的字段。
class transaction: public transaction_prefix
{
  private:
    //缓存的状态
    mutable std::atomic hash_valid;       // 交易哈希是否有效
    mutable std::atomic blob_size_valid;  // 变量     

  public:
    std::vector > signatures; //count signatures  always the same as inputs count;整个交易的签名数量,总是与交易的输入数量相等。
    rct::rctSig rct_signatures;

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

signatures:包含整个交易的所有签名数据,注意:签名数量与交易输入的数量一直相等。

__Note : 所有交易和块的结构定义在这个文件中:monero/src/cryptonote_basic/cryptonote_basic.h

签名

签名类型:分两种。
rct::rctSig rct_signatures;
crypto::signature

rct::rctSig

struct rctSig: public rctSigBase {
        rctSigPrunable p;
};

挖矿

monero/src/cryptonote_basic/miner.h

哈希

monero/src/crypto/hash.h

#define POD_CLASS struct

 POD_CLASS hash {
    char data[HASH_SIZE];
  };
  POD_CLASS hash8 {
    char data[8];
  };

钱包的API,

monero/src/wallet/api/wallet2_api.h

基础的数据

monero/src/common/util.h //各种工具

monero config

monero/src/cryptonote_config.h //门罗币的各种常量配置
门罗币的单位: 1XMR = 1012 "monoshis";
门罗币的总金额: Tatal Coin = 264 - 1 "monoshis";
2**64 - 1 = 1844 6744 073709551615(即:大约1844万)


本文由 Copernicus团队 姚永芯写作,转载无需授权。

你可能感兴趣的:(门罗币的交易,块结构)