本文僅討論地址的實(shí)現(xiàn)。不同的交易類型使用的的地址類型不同客税。
關(guān)鍵概念
-
交易類型
具體是指比特幣交易中l(wèi)ock/unlock script 的種類。
目前的bitcoin core 實(shí)現(xiàn)中包括如下4種:- P2PKH(pay to public key hash)
該類型的腳本可將bitcoin鎖定到某一公鑰hash上秧均。 - P2SH(pay to script hash)
該類型的腳本可將bitcoin鎖定到某一腳本的hash值上。 - P2WPKH(pay to witness public key hash)
類似于P2PKH讶隐,不過在交易結(jié)構(gòu)上將unlock script (即 witness )隔離到單獨(dú)的數(shù)據(jù)區(qū)域效五。 - P2WSH(pay to witness script hash)
類似于P2SH,在交易結(jié)構(gòu)上也將unlock script (即 witness )隔離到單獨(dú)的數(shù)據(jù)區(qū)域戒劫。地址長度也有所不同迅细。
- P2PKH(pay to public key hash)
-
地址
具體分兩種- 公鑰hash
鎖定到該種地址上的bitcoin,可用密鑰簽名即可解鎖使用统阿。 - 腳本hash
鎖定到該種地址上的bitcoin,可用密鑰簽名+補(bǔ)償腳本解鎖使用结澄。
- 公鑰hash
具體實(shí)現(xiàn)
地址在bitcoin源碼中的實(shí)現(xiàn)為(standard.h):
/**
* A txout script template with a specific destination. It is either:
* * CNoDestination: no destination set
* * CKeyID: TX_PUBKEYHASH destination (P2PKH)
* * CScriptID: TX_SCRIPTHASH destination (P2SH)
* * WitnessV0ScriptHash: TX_WITNESS_V0_SCRIPTHASH destination (P2WSH)
* * WitnessV0KeyHash: TX_WITNESS_V0_KEYHASH destination (P2WPKH)
* * WitnessUnknown: TX_WITNESS_UNKNOWN destination (P2W???)
* A CTxDestination is the internal data type encoded in a bitcoin address
*/
typedef boost::variant<CNoDestination, CKeyID, CScriptID, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessUnknown> CTxDestination;
其中P2PKH交易類型的地址實(shí)現(xiàn)如下(pubkey.h):
可以看到該地址類型囱修,即為master-bitcoin中所說的公鑰hash地址
//! Get the KeyID of this public key (hash of its serialization)
CKeyID GetID() const
{
return CKeyID(Hash160(vch, vch + size()));
}
P2SH 交易類型的地址實(shí)現(xiàn)如下(standard.cpp,standard.h)
/** A reference to a CScript: the Hash160 of its serialization (see script.*/
// standard.h
class CScriptID : public uint160
{
public:
CScriptID() : uint160() {}
CScriptID(const CScript& in);
CScriptID(const uint160& in) : uint160(in) {}
};
//standard.cpp
CScriptID::CScriptID(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {}
Vo版本的P2WSH地址實(shí)現(xiàn)如下:(standard.h)
struct WitnessV0ScriptHash : public uint256
{
WitnessV0ScriptHash() : uint256() {}
explicit WitnessV0ScriptHash(const uint256& hash) : uint256(hash) {}
using uint256::uint256;
};
Vo版本的P2WPKH地址實(shí)現(xiàn)如下(standard.h)
struct WitnessV0KeyHash : public uint160
{
WitnessV0KeyHash() : uint160() {}
explicit WitnessV0KeyHash(const uint160& hash) : uint160(hash) {}
using uint160::uint160;
};