比特币源码阅读(交易-CTransaction)
https://en.bitcoin.it/wiki/Protocol_documentation#tx
文章图片
2018-07-27 17-29-16 的屏幕截图.png
【比特币源码阅读(交易-CTransaction)】src/primitives/transaction.h
/** The basic transaction that is broadcasted on the network and contained in
* blocks.A transaction can contain multiple inputs and outputs.
*/
class CTransaction
{
public:
// Default transaction version.
static const int32_t CURRENT_VERSION=2;
// Changing the default transaction version requires a two step process: first
// adapting relay policy by bumping MAX_STANDARD_VERSION, and then later date
// bumping the default CURRENT_VERSION at which point both CURRENT_VERSION and
// MAX_STANDARD_VERSION will be equal.
static const int32_t MAX_STANDARD_VERSION=2;
// The local variables are made const to prevent unintended modification
// without updating the cached hash value. However, CTransaction is not
// actually immutable(不变的);
deserialization and assignment are implemented,
// and bypass the constness. This is safe, as they update the entire
// structure, including the hash.
const std::vector vin;
//输入
const std::vector vout;
//输出
const int32_t nVersion;
const uint32_t nLockTime;
private:
/** Memory only. */
const uint256 hash;
const uint256 m_witness_hash;
uint256 ComputeHash() const;
//所以区块浏览器上面的交易hash其实是算出来的,不是本来就存在与交易的数据结构中
uint256 ComputeWitnessHash() const;
public:
/** Construct a CTransaction that qualifies as IsNull() */
CTransaction();
/** Convert a CMutableTransaction into a CTransaction. */
CTransaction(const CMutableTransaction &tx);
CTransaction(CMutableTransaction &&tx);
template
inline void Serialize(Stream& s) const {
SerializeTransaction(*this, s);
}/** This deserializing constructor is provided instead of an Unserialize method.
*Unserialize is not possible, since it would require overwriting const fields. */
template
CTransaction(deserialize_type, Stream& s) : CTransaction(CMutableTransaction(deserialize, s)) {}bool IsNull() const {
return vin.empty() && vout.empty();
}const uint256& GetHash() const { return hash;
}
const uint256& GetWitnessHash() const { return m_witness_hash;
};
// Return sum of txouts.
CAmount GetValueOut() const;
// GetValueIn() is a method on CCoinsViewCache, because
// inputs must be known to compute value in./**
* Get the total transaction size in bytes, including witness data.
* "Total Size" defined in BIP141 and BIP144.
* @return Total transaction size in bytes
*/
unsigned int GetTotalSize() const;
bool IsCoinBase() const
{
return (vin.size() == 1 && vin[0].prevout.IsNull());
//是否为CoinBase的判断方法
}friend bool operator==(const CTransaction& a, const CTransaction& b)
{
return a.hash == b.hash;
//hash相等
}friend bool operator!=(const CTransaction& a, const CTransaction& b)
{
return a.hash != b.hash;
//hash不等
}std::string ToString() const;
bool HasWitness() const
{
for (size_t i = 0;
i < vin.size();
i++) {
if (!vin[i].scriptWitness.IsNull()) //会不会存在部分vin存在scriptWitness()
return true;
}
}
return false;
}
};
推荐阅读
- Android事件传递源码分析
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
- ffmpeg源码分析01(结构体)
- Java程序员阅读源码的小技巧,原来大牛都是这样读的,赶紧看看!
- Vue源码分析—响应式原理(二)
- 华雨欢(传统投资市场回暖,币市暴涨暴跌后回归震荡)
- SwiftUI|SwiftUI iOS 瀑布流组件之仿CollectionView不规则图文混合(教程含源码)
- java|java b2b2c shop 多用户商城系统源码- config 修改配置
- Spring源码解析_属性赋值