块头
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
// 交易输出
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
交易输入总共分为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团队 姚永芯
写作,转载无需授权。