我国为何要全面打击比特币-与美国博弈激化,粉碎其险恶用心

静香

我国为何要全面打击比特币-与美国博弈激化,粉碎其险恶用心


比特币核心客户端实现了JSON-RPC接口

这个接口也可以通过命令行帮助程序bitcoin-cli访问。命令行可以使用API进行编程,让我们有能力进行交互实验。开始前,调用help命令查看可用的比特币RPC命令列表:

$ bitcoin-cli helpaddmultisigaddress nrequired ["key",...] ( "account" )addnode "node" "add|remove|onetry"backupwallet "destination"createmultisig nrequired ["key",...]createrawtransaction [{"txid":"id","vout":n},...] {"address":amount,...}decoderawtransaction "hexstring"decodescript "hex"dumpprivkey "bitcoinaddress"dumpwallet "filename"getaccount "bitcoinaddress"getaccountaddress "account"getaddednodeinfo dns ( "node" )getaddressesbyaccount "account"getbalance ( "account" minconf )getbestblockhashgetblock "hash" ( verbose )getblockchaininfogetblockcountgetblockhash indexgetblocktemplate ( "jsonrequestobject" )getconnectioncountgetdifficultygetgenerategethashespersecgetinfogetmininginfogetnettotalsgetnetworkhashps ( blocks height )getnetworkinfogetnewaddress ( "account" )getpeerinfogetrawchangeaddressgetrawmempool ( verbose )getrawtransaction "txid" ( verbose )getreceivedbyaccount "account" ( minconf )getreceivedbyaddress "bitcoinaddress" ( minconf )gettransaction "txid"gettxout "txid" n ( includemempool )gettxoutsetinfogetunconfirmedbalancegetwalletinfogetwork ( "data" )help ( "command" )importprivkey "bitcoinprivkey" ( "label" rescan )importwallet "filename"keypoolrefill ( newsize )listaccounts ( minconf )listaddressgroupingslistlockunspentlistreceivedbyaccount ( minconf includeempty )listreceivedbyaddress ( minconf includeempty )listsinceblock ( "blockhash" target-confirmations )listtransactions ( "account" count from )listunspent ( minconf maxconf ["address",...] )lockunspent unlock [{"txid":"txid","vout":n},...]move "fromaccount" "toaccount" amount ( minconf "comment" )pingsendfrom "fromaccount" "tobitcoinaddress" amount ( minconf "comment" "commentto")sendmany "fromaccount" {"address":amount,...} ( minconf "comment" )sendrawtransaction "hexstring" ( allowhighfees )sendtoaddress "bitcoinaddress" amount ( "comment" "comment-to" )setaccount "bitcoinaddress" "account"setgenerate generate ( genproclimit )settxfee amountsignmessage "bitcoinaddress" "message"signrawtransaction "hexstring" ( [{"txid":"id","vout":n,"scriptPub-Key":"hex","redeemScript":"hex"},...] ["privatekey1",...] sighashtype )stopsubmitblock "hexdata" ( "jsonparametersobject" )validateaddress "bitcoinaddress"verifychain ( checklevel numBTClocks )verifymessage "bitcoinaddress" "signature" "message"walletlockwalletpassphrase "passphrase" timeoutwalletpassphrasechange "oldpassphrase" "newpassphrase"

获得比特币核心客户端状态的信息

命令:getinfo

比特币getinfoRPC命令显示关于比特币网络节点、钱包、区块链数据库状态的基础信息。使用bitcoin-cli运行它:

$ bitcoin-cli getinfo{"version" : 90000,"protocolversion" : 70002,"walletversion" : 60000,"balance" : 0.00000000,"blocks" : 286216,"timeoffset" : -72,"connections" : 4,"proxy" : "","difficulty" : 2621404453.06461525,"testnet" : false,"keypoololdest" : 1374553827,"keypoolsize" : 101,"paytxfee" : 0.00000000,"errors" : ""}

数据以JSON格式显示,JSON是一种可以很容易被编程语言“消耗”,但同时对人类可读性也很高的格式。在这些数据中,我们看到比特币软件客户端的版本编号(90000),协议编号(70002),钱包编号(60000)。我们看到钱包中的当前余额是0。我们看到当前的区块高度,这可以告诉我们有多少区块对此客户端已知(286216)。我们同样看到关于比特币网络和关于此客户端的各种数据。我们将在其他章节中更具体地探索这些设置。

bitcoind客户端需要花费可能超过一天的时间从其他比特币客户端下载区块以“赶上”当前区块链高度。你可以使用getinfo命令查看已知区块的数字以检查同步进度。

钱包设置及加密

命令:encryptwallet、walletpassphrase

在你向前生成秘钥和其他命令之前,你应当先用密码加密钱包。对于本例,将使用encryptwallet命令,密码为“foo”。很明显,在你自己操作的时候记得使用强且复杂的密码替换“foo”。

$ bitcoin-cli encryptwallet foowallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet.The keypool has been flushed, you need to make a new backup.$

你可以再次使用getinfo命令以验证钱包是否已经加密。这次你将发现有个叫做unlocked_until的新条目。这是一个计数器,告诉你保持钱包处于解锁状态的解密密码将在内存中存储多久。最初计数器设置为0,意味着钱包是被锁定的:

$ bitcoin-cli getinfo{ "version" : 90000,#[... other information...] "unlocked_until" : 0, "errors" : ""}$

想解锁钱包,要使用walletpassphrase命令。walletpassphrase命令需要两个参数——密码,和多久钱包会再次被自动锁定的秒数数字(计时器):

$ bitcoin-cli walletpassphrase foo 360$

你可以确认钱包是解锁状态然后通过再次运行getinfo查看超过时限:

$ bitcoin-cli getinfo{ "version" : 90000,#[... other information ...] "unlocked_until" : 1392580909, "errors" : ""}

钱包备份、纯文本导出及恢复

命令:backupwallet、importwallet、dumpwallet

下一步,我们将练习创建钱包的备份文件,然后从备份文件重新加载钱包。使用backupwallet命令备份,提供文件名作为命令参数。这里我们将钱包备份为文件wallet.backup:

$ bitcoin-cli backupwallet wallet.backup$

现在,为了重新加载备份文件,我们使用importwallet命令。如果你的钱包处于锁定状态,你将需要先将钱包解锁(参考下一节的walletpassphrase)以导入备份文件:

$ bitcoin-cli importwallet wallet.backup$

dumpwallet 命令用来将钱包转储为人类可读的文本文件:

$ bitcoin-cli dumpwallet wallet.txt$ more wallet.txt# Wallet dump created by Bitcoin v0.9.0rc1-beta (2014-01-31 09:30:15 +0100)# * Created on 2014-02- 8dT20:34:55Z# * Best block at time of backup was 286234(0000000000000000f74f0bc9d3c186267bc45c7b91c49a0386538ac24c0d3a44),# mined on 2014-02- 8dT20:24:01ZKzTg2wn6Z8s7ai5NA9MVX4vstHRsqP26QKJCzLg4JvFrp6mMaGB9 2013-07- 4dT04:30:27Zchange=1 # addr=16pJ6XkwSQv5ma5FSXMRPaXEYrENCEg47FKz3dVz7R6mUpXzdZy4gJEVZxXJwA15f198eVui4CUivXotzLBDKY 2013-07- 4dT04:30:27Zchange=1 # addr=17oJds8kaN8LP8kuAkWTco6ZM7BGXFC3gk[... many more keys ...]$

钱包地址及接收交易

命令:getnewaddress、getreceivedbyaddress、listtransactions、getaddressesbyaccount、getbalance

比特币参考客户端维护了一个地址池,地址池的大小可以用getinfo命令keypoolsize参数获取。这些地址是自动生成的,可以被用作公开接收地址或零钱地址。使用getnewaddress命令可以获得其中的一个地址:

$ bitcoin-cli getnewaddress1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL

现在我们可以使用这个地址从一个外部钱包(假设你在其他交易所、在线钱包或其他bitcoind钱包有一些比特币)向我们的bitcoind钱包发送一小笔比特币。在本例中,我们将向下面的地址中发送50mBTC(0.050比特币)。

我们可以询问bitcoind客户端此地址已经接收到的比特币数额,以及指定该数额要被加到余额中所需要的确认数。在本例中,我们指定只需要0个确认。在从另一个钱包发送比特币数秒之后,我们将在这个钱包看到反应。我们用getreceivedbyaddress命令、这个地址及设置确认数为0:

$ bitcoin-cli getreceivedbyaddress 1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL 00.05000000

如果我们忽略这个命令后面的0,我们将只能在至少minconf个确认之后才能看到数额,minconf是想要某笔交易出现在余额中所设置的最少确认数。minconf设置在bitcoind配置文件指定。由于这笔发送比特币的交易仅在数秒之前完成,它还没有被确认,因而我们将看到余额是0:

$ bitcoin-cli getreceivedbyaddress 1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL0.00000000

整个钱包接收到的交易可以通过使用listtransactions命令展示出来:

$ bitcoin-cli listtransactions[ { "account" : "", "address":"1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL", "category" : "receive", "amount" : 0.05000000, "confirmations" : 0, "txid" : "9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "time" : 1392660908, "timereceived" : 1392660908 }]

我们可以使用getaddressesbyaccount命令列出整个钱包的所有地址:

$ bitcoin-cli getaddressesbyaccount ""[ "1LQoTPYy1TyERbNV4zZbhEmgyfAipC6eqL", "17vrg8uwMQUibkvS2ECRX4zpcVJ78iFaZS", "1FvRHWhHBBZA8cGRRsGiAeqEzUmjJkJQWR", "1NVJK3JsL41BF1KyxrUyJW5XHjunjfp2jz", "14MZqqzCxjc99M5ipsQSRfieT7qPZcM7Df", "1BhrGvtKFjTAhGdPGbrEwP3xvFjkJBuFCa", "15nem8CX91XtQE8B1Hdv97jE8X44H3DQMT", "1Q3q6taTsUiv3mMemEuQQJ9sGLEGaSjo81", "1HoSiTg8sb16oE6SrmazQEwcGEv8obv9ns", "13fE8BGhBvnoy68yZKuWJ2hheYKovSDjqM", "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL", "1KHUmVfCJteJ21LmRXHSpPoe23rXKifAb2", "1LqJZz1D9yHxG4cLkdujnqG5jNNGmPeAMD"]

最后,getbalance命令将显示所有经过至少minconf个确认的交易加和后的余额:

$ bitcoin-cli getbalance0.05000000

如果交易还未被确认,getbalance返回的余额将为0。配置项“minconf”决定了交易在余额中体现的最少确认数。

探索及解码交易

命令:gettransaction、getrawtransaction、decoderawtransaction

我们将使用gettransaction命令探索前面列出的入账交易。我们使用gettransaction命令通过交易哈希值获取一笔交易,交易哈希值出现在前面的txid条目:

$ bitcoin-cli gettransaction9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3{ "amount" : 0.05000000, "confirmations" : 0, "txid":"9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "time" : 1392660908, "timereceived" : 1392660908, "details" : [ { "account" : "", "address":"1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL", "category" : "receive", "amount" : 0.05000000 } ]}

交易ID在交易确认之前并不权威。区块链中找不到交易哈希值并不意味着此笔交易没有进行。这被称作“交易延展性”,因为交易哈希值在区块确认之前是可以更改的。在确认之后txid是不变且权威的。

用gettransaction命令显示的交易格式为简化格式。若要得到整个交易代码并且将之解码,我们将使用两个命令:getrawtransaction和decoderawtransaction。第一,getrawtransaction把交易哈希值(txid)当做一个参数,并且把整个交易以一个“原始”的十六进制字符串的形式返回,而这也正是交易在比特币网络上存在的形式:

$ bitcoin-cli getrawtransaction 9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae30100000001d717279515f88e2f56ce4e8a31e2ae3e9f00ba1d0add648e80c480ea22e0c7d3000000008b483045022100a4ebbeec83225dedead659bbde7da3d026c8b8e12e61a2df0dd0758e227383b302203301768ef878007e9ef7c304f70ffaf1f2c975b192d34c5b9b2ac1bd193dfba2014104793ac8a58ea751f9710e39aad2e296cc14daa44fa59248be58ede65e4c4b884ac5b5b6dede05ba84727e34c8fd3ee1d6929d7a44b6e111d41cc79e05dbfe5ceaffffffff02404b4c00000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac1f312906000000001976a914107b7086b31518935c8d28703d66d09b3623134388ac00000000

要解码这个十六进制字符串,我们使用decoderawtransaction命令。复制粘贴这个十六进制字符串作为decoderawtransaction的第一个参数以将整个内容解读为JSON数据格式(由于格式原因,在下面例子中十六进制字符串被缩短):

$ bitcoin-cli decoderawtransaction 0100000001d717...388ac00000000{ "txid":"9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "version" : 1, "locktime" : 0, "vin" : [ { "txid":"d3c7e022ea80c4808e64dd0a1dba009f3eaee2318a4ece562f8ef815952717d7", "vout" : 0, "scriptSig" : { "asm" : "3045022100a4ebbeec83225dedead659bbde7da3d026c8b8e12e61a2df0dd0758e227383b302203301768ef878007e9ef7c304f70ffaf1f2c975b192d34c5b9b2ac1bd193dfba20104793ac8a58ea751f9710e39aad2e296cc14daa44fa59248be58ede65e4c4b?884ac5b5b6dede05ba84727e34c8fd3ee1d6929d7a44b6e111d41cc79e05dbfe5cea", "hex": "483045022100a4ebbeec83225dedead659bbde7da3d026c8b8e12e61a2df0dd0758e227383b302203301768ef878007e9ef7c304f70ffaf1f2c975b192d34c5b9b2ac1bd193dfba2014104793ac8a58ea751f9710e39aad2e296cc14daa44fa59248be58ede65e4c4b884ac5b5b6dede05ba84727e34c8fd3ee1d6929d7a44b6e111d41cc79e05dbfe5cea" }, "sequence" : 4294967295 } ], "vout" : [ { "value" : 0.05000000, "n" : 0, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 07bdb518fa2e6089fd810235cf1100c9c13d1fd2 OP_EQUALVERIFY OP_CHECKSIG", "hex" :"76a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL" ] } }, { "value" : 1.03362847, "n" : 1, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 107b7086b31518935c8d28703d66d09b36231343 OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a914107b7086b31518935c8d28703d66d09b3623134388ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "12W9goQ3P7Waw5JH8fRVs1e2rVAKoGnvoy" ] } } ]}

交易解码展示这笔交易的所有成分,包括交易的输入及输出。在这个例子中,我们可以看到这笔给我们新地址存入50mBTC的交易使用了一个输入并且产生两个输出。这笔交易的输入是前一笔确认交易的输出(展示位以d3c7开头的vin txid)。两个输出则是50mBTC存入额度及返回给发送者的找零。

我们可以使用相同命令(例如gettransaction)通过检查由本次交易的txid索引的前一笔交易进一步探索区块链。通过从一笔交易跳到另外一笔交易,我们可以追溯一连串的交易,因为币值一定是从一个拥有者的地址传送到另一个拥有者的地址。

一旦我们接收到的交易以记录在区块中的方式被确认,gettransaction命令将返回附加信息,显示包含交易的区块的哈希值(标识符)。

$ bitcoin-cli gettransaction 9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3{ "amount" : 0.05000000, "confirmations" : 1, "blockhash" : "000000000000000051d2e759c63a26e247f185ecb7926ed7a6624bc31c2a717b", "blockindex" : 18, "blocktime" : 1392660808, "txid" : "9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "time" : 1392660908, "timereceived" : 1392660908, "details" : [ { "account" : "", "address" : "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL", "category" : "receive", "amount" : 0.05000000 } ]}

这里,我们在区块哈希值(这笔交易所在区块的哈希值)条目看到新信息,以及值为18的区块索引(表明我们的交易为此区块的第18笔交易)。

交易数据库索引及txindex选项

比特币核心默认建立包含仅与用户钱包相关交易的数据库。若你想使用类似gettransaction的命令访问所有交易,你需要配置比特币核心去建立一个完整的交易索引,这个可以通过txindex选项实现。在比特币核心配置文件中将txindex赋值为1(通常在安装目录的.bitcoin/bitcoin.conf中可以找到)。一旦你改变了此参数,你需要重启bitcoind,并等待其重建索引。

探索区块

命令:getblock、getblockhash

既然我们知道我们的交易在哪个区块中,我们可以使用getblock命令,并把区块哈希值作为参数来查询对应的区块:

$ bitcoin-cli getblock 000000000000000051d2e759c63a26e247f185ecb7926ed7a6624b? c31c2a717b true{ "hash" : "000000000000000051d2e759c63a26e247f185ecb7926ed7a6624bc31c2a717b", "confirmations" : 2, "size" : 248758, "height" : 286384, "version" : 2, "merkleroot" : "9891747e37903016c3b77c7a0ef10acf467c530de52d84735bd55538719f9916", "tx" : [ "46e130ab3c67d31d2b2c7f8fbc1ca71604a72e6bc504c8a35f777286c6d89bf0", "2d5625725b66d6c1da88b80b41e8c07dc5179ae2553361c96b14bcf1ce2c3868", "923392fc41904894f32d7c127059bed27dbb3cfd550d87b9a2dc03824f249c80", "f983739510a0f75837a82bfd9c96cd72090b15fa3928efb9cce95f6884203214", "190e1b010d5a53161aa0733b953eb29ef1074070658aaa656f933ded1a177952", "ee791ec8161440262f6e9144d5702f0057cef7e5767bc043879b7c2ff3ff5277", "4c45449ff56582664abfadeb1907756d9bc90601d32387d9cfd4f1ef813b46be", "3b031ed886c6d5220b3e3a28e3261727f3b4f0b29de5f93bc2de3e97938a8a53", "14b533283751e34a8065952fd1cd2c954e3d37aaa69d4b183ac6483481e5497d", "57b28365adaff61aaf60462e917a7cc9931904258127685c18f136eeaebd5d35", "8c0cc19fff6b66980f90af39bee20294bc745baf32cd83199aa83a1f0cd6ca51", "1b408640d54a1409d66ddaf3915a9dc2e8a6227439e8d91d2f74e704ba1cdae2", "0568f4fad1fdeff4dc70b106b0f0ec7827642c05fe5d2295b9deba4f5c5f5168", "9194bfe5756c7ec04743341a3605da285752685b9c7eebb594c6ed9ec9145f86", "765038fc1d444c5d5db9163ba1cc74bba2b4f87dd87985342813bd24021b6faf", "bff1caa9c20fa4eef33877765ee0a7d599fd1962417871ca63a2486476637136", "d76aa89083f56fcce4d5bf7fcf20c0406abdac0375a2d3c62007f64aa80bed74", "e57a4c70f91c8d9ba0ff0a55987ea578affb92daaa59c76820125f31a9584dfc", "9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3",#[... many more transactions ...] ], "time" : 1392660808, "nonce" : 3888130470, "bits" : "19015f53", "difficulty" : 3129573174.52228737, "chainwork" : "000000000000000000000000000000000000000000001931d1658fc04879e466", "previousblockhash" : "0000000000000000177e61d5f6ba6b9450e0dade9f39c257b4d48b4941ac77e7", "nextblockhash" : "0000000000000001239d2c3bf7f4c68a4ca673e434702a57da8fe0d829a92eb6"

这个区块包含367笔交易,并且如你所见,列出的第18笔交易(9ca8f9…)就是存入50mBTC到我们地址的txid我们可以通过heigh条目来判断:这就是整个区块链中第286,384个区块。

我们同样可以使用getblockhash命令通过区块高度来检索一个区块,这样需要将区块高度作为参数,并返回那个区块的区块哈希值。

$ bitcoin-cli getblockhash 0$ bitcoin-cli 0000000000019d6689c085ae165831e934ff763ae46a2a6c17? 2b3f1b60a8ce26f

这里,我们获得了“创世区块”的区块哈希值,这是被中本聪所挖的第一个区块,高度为0。所获得的区块信息如下:

$ bitcoin-cli getblock 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1?b60a8ce26f{ "hash" : "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26?f", "confirmations" : 286388, "size" : 285, "height" : 0, "version" : 1, "merkleroot" : "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7af? deda33b", "tx" : [ "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b" ], "time" : 1231006505, "nonce" : 2083236893, "bits" : "1d00ffff", "difficulty" : 1.00000000, "chainwork" : "0000000000000000000000000000000000000000000000000000000100010001", "nextblockhash" : "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048" }

getblock、getblockhash和gettransaction命令可以按照一定编程准则,去探索区块链数据库。

基于UTXO(未花费的交易输出)的建立、签名与提交

命令:listunspent、gettxout、createrawtransaction、decoderawtransaction、signrawtransaction、sendrawtransaction。

比特币的交易是基于花费“输出”上的,即上一笔交易的支出,整个交易在地址之间转移所有权。我们的钱包现在收到了一笔向我们钱包地址发来的钱(输出)。一旦它被确定之后,那笔钱就属于我们了。

首先,我们可以使用listunspent命令去查看我们钱包中所有剩余的从之前交易中已确认的支出:

$ bitcoin-cli listunspent[ {  "txid" : "9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "vout" : 0, "address" : "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL", "account" : "", "scriptPubKey" : "76a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac", "amount" : 0.05000000, "confirmations" : 7 } ]

我们发现交易9ca8f9建立了一个被指派到1hvzSo地址的输出(“vout”一项为0)对于50mBTC数量的比特币在这个时间点已经收到了7次确认。通过参考交易之前的txit和vout指数,交易系统将先前的输出变为本次的输入。我们现在可以创立一个花费第0个vout的易9ca8f9的账单。利用他的输入分配成新的输出,即给新地址赋值。

首先,让我们仔细观察输出的结果。我们可以使用gettxout命令来得到未花费的输出的详细细节。交易输出通常可以参考txid和vout两个指标。以下就是我们通过gettxout命令得到的结果:

$ bitcoin-cli gettxout 9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3 0{ "bestblock" : "0000000000000001405ce69bd4ceebcdfdb537749cebe89d371eb37e13899fd9", "confirmations" : 7, "value" : 0.05000000, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 07bdb518fa2e6089fd810235cf1100c9c13d1fd2 OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL" ] }, "version" : 1, "coinbase" : false}

在这里我们看到由50mBTC分配到我们的账户地址1hvz…中。如果我们想用掉剩余的比特币,我们要重新建立一笔新的交易。首先,我们为这笔交易建立一个新的地址,告诉它将去往哪里:

$ bitcoin-cli getnewaddress 1LnfTndy3qzXGN19Jwscj1T8LR3MVe3JDb

我们将25mBTC送往我们钱包中新的地址1LnfTn…。在这笔新的交易中,我们将要花费50mBTC并且放入25mBTC到这个新地址中。因为我们必须花费所有之前交易的输出,同时我们必然产生一些找零。我们将产生的找零放回1hvz…的地址之中,即将找零放回到原先产生比特币的地址之中。最后,我们必须为这次交易支出一些费用——我们将0.5mBTC作为交易费,最终再存入24.5mBTC的找零。新的输出(25mBTC+24.5mBTC=49.5mBTC)和输入(50 mBTC)之间的差额就是奖励给矿工的交易费。

我们用createrawtransaction命令去建立一笔交易。我们将交易的收入(50已确认未支出的mBTC)和两笔交易的输出(送往新地址的比特币和从原先账户找回的零钱)作为createrawtransaction的参数。

$ bitcoin-cli createrawtransaction '[{"txid" : "9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "vout" : 0}]' '{"1LnfTndy3qzXGN19Jwscj1T8LR3MVe3JDb": 0.025, "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL": 0.0245}'0100000001e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c0000000000ffffffff02a0252600000000001976a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac00000000

createrawtransaction命令产生了一个原始十六进制字符串,其中编码了这笔交易的诸多细节。我们首先要通过decoderawtransaction命令来解码这个字符串,以确认所有的细节准确无误:

 $ bitcoin-cli decoderawtransaction 0100000001e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c0000000000ffffffff02a0252600000000001976a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac00000000{ "txid" : "0793299cb26246a8d24e468ec285a9520a1c30fcb5b6125a102e3fc05d4f3cba", "version" : 1, "locktime" : 0, "vin" : [ { "txid" : "9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "vout" : 0, "scriptSig" : { "asm" : "", "hex" : ""  }, "sequence" : 4294967295 } ], "vout" : [ { "value" : 0.02500000, "n" : 0, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 d90d36e98f62968d2bc9bbd68107564a156a9bcf OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "1LnfTndy3qzXGN19Jwscj1T8LR3MVe3JDb" ] } }, { "value" : 0.02450000, "n" : 1, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 07bdb518fa2e6089fd810235cf1100c9c13d1fd2 OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL" ] }  } ] }

结果无误!我们的交易“消耗了”从我们已确认的交易中未花费的输出,然后将它变成两笔输出,一个是走向了新地址的25mBTC,另一个是从原来地址返回的24.5mBTC零钱。这之间0.5mBTC的差额作为交易费,以奖励挖出包含我们这笔交易区块的矿工。

你有可能注意到,交易中包含一个空的条目scriptSig,因为我们并没有给它签名。如果没有签名,那么交易是没有意义的;同时我们也不能证明我们拥有未花费的输出的来源地址的所有权。通过签名,我们移除了输出上的障碍同时证明了我们的输出可靠。我们使用signrawtransaction 命令去签名交易。它需要原始十六进制的字符串作为参数:

》一个加密的钱包在签名之前必须解密,因为签名需要利用钱包中的秘钥。

$ bitcoin-cli walletpassphrase foo 360$ bitcoin-cli signrawtransaction 0100000001e34ac1e2baac09c366fce1c2245536bda8?f7db0f6685862aecf53ebd69f9a89c0000000000ffffffff02a0252600000000001976a914d90?d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e?6089fd810235cf1100c9c13d1fd288ac00000000{ "hex" : "0100000001e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c000000006a47304402203e8a16522da80cef66bacfbc0c800c6d52c4a26d1d86a54e0a1b76d661f020c9022010397f00149f2a8fb2bc5bca52f2d7a7f87e3897a273ef54b277e4af52051a06012103c9700559f690c4a9182faa8bed88ad8a0c563777ac1d3f00fd44ea6c71dc5127ffffffff02a0252600000000001976a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac00000000", "complete" : true }

输入signrawtransaction命令后,得到另一串十六进制的原始加密交易。我们要对它进行解密,然后去查看发生的变化,请输入decoderawtransaction命令:

$ bitcoin-cli decoderawtransaction0100000001e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c000000006a47304402203e8a16522da80cef66bacfbc0c800c6d52c4a26d1d86a54e0a1b76d661f020c9022010397f00149f2a8fb2bc5bca52f2d7a7f87e3897a273ef54b277e4af52051a06012103c9700559f690c4a9182faa8bed88ad8a0c563777ac1d3f00fd44ea6c71dc5127ffffffff02a0252600000000001976a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac00000000{ "txid" : "ae74538baa914f3799081ba78429d5d84f36a0127438e9f721dff584ac17b346", "version" : 1, "locktime" : 0, "vin" : [ { "txid" : "9ca8f969bd3ef5ec2a8685660fdbf7a8bd365524c2e1fc66c309acbae2c14ae3", "vout" : 0, "scriptSig" : { "asm" : "304402203e8a16522da80cef66bacfbc0c800c6d52c4a26d1d86a54e0a1b76d661f020c9022010397f00149f2a8fb2bc5bca52f2d7a7f87e3897a273ef54b277e4af52051a0601 03c9700559f690c4a9182faa8bed88ad8a0c563777ac1d3f00fd44ea6c71dc5127", "hex" : "47304402203e8a16522da80cef66bacfbc0c800c6d52c4a26d1d86a54e0a1b76d661f020c9022010397f00149f2a8fb2bc5bca52f2d7a7f87e3897a273ef54b277e4af52051a06012103c9700559f690c4a9182faa8bed88ad8a0c563777ac1d3f00fd44ea6c71dc5127"},  "sequence" : 4294967295 } ], "vout" : [  { "value" : 0.02500000, "n" : 0, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 d90d36e98f62968d2bc9bbd68107564a156a9bcf OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "1LnfTndy3qzXGN19Jwscj1T8LR3MVe3JDb" ] }  },  { "value" : 0.02450000, "n" : 1, "scriptPubKey" : { "asm" : "OP_DUP OP_HASH160 07bdb518fa2e6089fd810235cf1100c9c13d1fd2 OP_EQUALVERIFY OP_CHECKSIG", "hex" : "76a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac", "reqSigs" : 1, "type" : "pubkeyhash", "addresses" : [ "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL" ] }  }  ] }

现在,交易中的收入包含了scritSig,一串证明钱包地址1hvz…所有权的数字签名,同时移除了支出上的障碍,然后我们可以对钱包中的钱进行消费。签名可以让这笔交易被比特币交易网络中的任何节点验证,使他们变得可靠。

现在,该是提交新交易到比特币网络的时候了。我们使用由原始十六进制signrawtransaction命令生成的sendrawtransaction命令。以下就是和刚才解码时类似的字符串:

$ bitcoin-cli sendrawtransaction 0100000001e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c000000006a47304402203e8a16522da80cef66bacfbc0c800c6d52c4a26d1d86a54e0a1b76d661f020c9022010397f00149f2a8fb2bc5bca52f2d7a7f87e3897a273ef54b277e4af52051a06012103c9700559f690c4a9182faa8bed88ad8a0c563777ac1d3f00fd44ea6c71dc5127ffffffff02a0252600000000001976a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac00000000ae74538baa914f3799081ba78429d5d84f36a0127438e9f721dff584ac17b346

当使用sendrawtransaction命令发布交易到比特币网络时,它会返回交易的哈希值。我们现在可以通过gettransaction命令查询交易ID:

 $ bitcoin-cli gettransaction ae74538baa914f3799081ba78429d5d84f36a0127438e9f721dff584ac17b346{ "amount" : 0.00000000, "fee" : -0.00050000, "confirmations" : 0, "txid" : "ae74538baa914f3799081ba78429d5d84f36a0127438e9f721dff584ac17b346",  "time" : 1392666702, "timereceived" : 1392666702, "details" : [ { "account" : "", "address" : "1LnfTndy3qzXGN19Jwscj1T8LR3MVe3JDb", "category" : "send", "amount" : -0.02500000, "fee" : -0.00050000 },  { "account" : "", "address" : "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL", "category" : "send", "amount" : -0.02450000, "fee" : -0.00050000 },  { "account" : "", "address" : "1LnfTndy3qzXGN19Jwscj1T8LR3MVe3JDb", "category" : "receive", "amount" : 0.02500000 },  { "account" : "", "address" : "1hvzSofGwT8cjb8JU7nBsCSfEVQX5u9CL", "category" : "receive", "amount" : 0.02450000 } ]}

和以前一样,我们同样可以通过使用getrawtransaction和decodetransaction命令来检查交易中的细节。这些命令会得到一个在发送到比特币网络之前进行编码和解码并且十分精准的原始十六进制字符串。

更多交易所入口

一站式注册各大交易所、点击进入加密世界、永不失联,币安Binance/欧易OKX/GATE.IO芝麻开门/Bitget/抹茶MEXC/火币Huobi

点击进入 永不失联

目录[+]