中本聪在创世区块中写的名言:TheTimes03/Jan/2009Chancelloronbrinkofsecondbailoutforbanks到底写在哪里了?//src/kernel/chainparams.cpp:61行staticCBlockCreateGen
The Times 03/Jan/2009 Chancellor on brink of second bailout for banks
到底写在哪里了?//src/kernel/chainparams.cpp:61行
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}
// src/kernel/chainparams.cpp:29行
static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
{
CMutableTransaction txNew;
txNew.nVersion = 1;
txNew.vin.resize(1);
txNew.vout.resize(1);
//写在这里了。vin.scriptSig是解锁脚本。但因为是创世区块,所以解锁脚本没有什么用处,可以随便写点东西。后面的交易就可以随意填写了,不然无法解锁,交易就会失败。
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
txNew.vout[0].nValue = genesisReward;
txNew.vout[0].scriptPubKey = genesisOutputScript;
CBlock genesis;
genesis.nTime = nTime;
genesis.nBits = nBits;
genesis.nNonce = nNonce;
genesis.nVersion = nVersion;
genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
genesis.hashPrevBlock.SetNull();
genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
return genesis;
}
class COutPoint
{
public:
Txid hash; // 交易的hash值
uint32_t n; //交易vout vector中的索引位置
}
class CTxIn
{
public:
COutPoint prevout; //花费哪一个交易中,哪一个CTxOut
CScript scriptSig; //解锁脚本;可以简单理解用私钥做的一个签名,用于解锁prevout的scriptPubKey锁定脚本。
uint32_t nSequence;
}
class CTxOut
{
public:
CAmount nValue; // 多少比特币,以聪为单位
CScript scriptPubKey; // 锁定脚本;本质是几个汇编命令,可以粗略的理解为用公钥做的一个加密,智能通过私钥解密(也就是CTxIn中的scriptSig)。谁能解密,就可以花费nValue的钱。
}
class CTransaction
{
public:
const std::vector<CTxIn> vin; //多个输入
const std::vector<CTxOut> vout; //多个输出;没有指定输出的话,多余的钱就会全被给矿工了。
const int32_t nVersion;
const uint32_t nLockTime;
}
bitcoin-cli createrawtransaction
'[{
"txid" : "<txid_of_selected_block>",
"vout" : <vout>
}]'
'{"<recipient_address>": <amount_to_send>, "<sender_address>": <amount_change>}'
createrawtransaction
接口vin参数和网络中传播的vin没有太大区别,但是vout参数则不同,用户传入的是adddress:amount的json格式,就是给address转多少btc的意思,钱包会把这个参数的address地址和amount变成vout的scriptpubkey和value。然后打包成网络中传输的vout。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!