{"content":{"title":"比特币 常见的几个疑惑点解密","body":"1. 中本聪在创世区块中写的名言：`The Times 03/Jan/2009 Chancellor on brink of second bailout for banks`到底写在哪里了？\r\n\r\n\r\n```\r\n//src/kernel/chainparams.cpp:61行\r\nstatic CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)\r\n{\r\n    const char* pszTimestamp = \"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks\";\r\n    const CScript genesisOutputScript = CScript() << ParseHex(\"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f\") << OP_CHECKSIG;\r\n    return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);\r\n}\r\n```\r\n\r\n```\r\n// src/kernel/chainparams.cpp:29行\r\n\r\nstatic CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)\r\n{\r\n    CMutableTransaction txNew;\r\n    txNew.nVersion = 1;\r\n    txNew.vin.resize(1);\r\n    txNew.vout.resize(1);\r\n    //写在这里了。vin.scriptSig是解锁脚本。但因为是创世区块，所以解锁脚本没有什么用处，可以随便写点东西。后面的交易就可以随意填写了，不然无法解锁，交易就会失败。\r\n    txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));\r\n    txNew.vout[0].nValue = genesisReward;\r\n    txNew.vout[0].scriptPubKey = genesisOutputScript;\r\n\r\n    CBlock genesis;\r\n    genesis.nTime    = nTime;\r\n    genesis.nBits    = nBits;\r\n    genesis.nNonce   = nNonce;\r\n    genesis.nVersion = nVersion;\r\n    genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));\r\n    genesis.hashPrevBlock.SetNull();\r\n    genesis.hashMerkleRoot = BlockMerkleRoot(genesis);\r\n    return genesis;\r\n}\r\n\r\n```\r\n\r\n2. UTXO的具体含义\r\n\r\n```C++\r\nclass COutPoint\r\n{\r\npublic:\r\n    Txid hash; // 交易的hash值\r\n    uint32_t n; //交易vout vector中的索引位置\r\n }\r\n \r\n class CTxIn\r\n{\r\npublic:\r\n    COutPoint prevout;  //花费哪一个交易中，哪一个CTxOut\r\n    CScript scriptSig;  //解锁脚本；可以简单理解用私钥做的一个签名，用于解锁prevout的scriptPubKey锁定脚本。\r\n    uint32_t nSequence;\r\n}\r\n\r\nclass CTxOut\r\n{\r\npublic:\r\n    CAmount nValue; // 多少比特币，以聪为单位\r\n    CScript scriptPubKey; // 锁定脚本；本质是几个汇编命令，可以粗略的理解为用公钥做的一个加密，智能通过私钥解密（也就是CTxIn中的scriptSig）。谁能解密，就可以花费nValue的钱。\r\n}\r\n\r\nclass CTransaction\r\n{\r\npublic:\r\n    const std::vector<CTxIn> vin; //多个输入\r\n    const std::vector<CTxOut> vout; //多个输出；没有指定输出的话，多余的钱就会全被给矿工了。\r\n    const int32_t nVersion;\r\n    const uint32_t nLockTime;\r\n }\r\n \r\n```\r\n\r\n3. 钱包如何发送转账交易？\r\n\r\n```\r\n bitcoin-cli createrawtransaction\r\n    '[{\r\n        \"txid\" : \"<txid_of_selected_block>\",\r\n        \"vout\" : <vout>\r\n    }]'\r\n    '{\"<recipient_address>\": <amount_to_send>, \"<sender_address>\": <amount_change>}'\r\n```\r\n\r\n`createrawtransaction`接口vin参数和网络中传播的vin没有太大区别，但是vout参数则不同，用户传入的是adddress：amount的json格式，就是给address转多少btc的意思，钱包会把这个参数的address地址和amount变成vout的scriptpubkey和value。然后打包成网络中传输的vout。"},"author":{"user":"https://learnblockchain.cn/people/808","address":null},"history":"bafkreieoba6hh6tmnuzbh3iieymboowdvi5mlybdoofqxdyxx55skcdrpy","timestamp":1703126665,"version":1}