比特币 常见的几个疑惑点解密

中本聪在创世区块中写的名言:TheTimes03/Jan/2009Chancelloronbrinkofsecondbailoutforbanks到底写在哪里了?//src/kernel/chainparams.cpp:61行staticCBlockCreateGen

  1. 中本聪在创世区块中写的名言: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;
}
  1. UTXO的具体含义
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;
 }
  1. 钱包如何发送转账交易?
 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。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

2 条评论

请先 登录 后评论
杜满想Elvin
杜满想Elvin
老程序员,区块链架构师