<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://zh-cn.bitcoin.it/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Riceball</id>
	<title>Bitcoin Wiki - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://zh-cn.bitcoin.it/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Riceball"/>
	<link rel="alternate" type="text/html" href="https://zh-cn.bitcoin.it/wiki/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Riceball"/>
	<updated>2026-04-29T23:00:12Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://zh-cn.bitcoin.it/w/index.php?title=Transactions&amp;diff=253</id>
		<title>Transactions</title>
		<link rel="alternate" type="text/html" href="https://zh-cn.bitcoin.it/w/index.php?title=Transactions&amp;diff=253"/>
		<updated>2011-06-02T10:06:19Z</updated>

		<summary type="html">&lt;p&gt;Riceball：​以内容“http://www.showmuch.com/article/upload_files/2011/05/Slide1-300x225.png  Bitcoin 电子货币系统的核心功能是面对面（点对点）支付，就像真实货币...”创建新页面&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;http://www.showmuch.com/article/upload_files/2011/05/Slide1-300x225.png&lt;br /&gt;
&lt;br /&gt;
Bitcoin 电子货币系统的核心功能是面对面（点对点）支付，就像真实货币一样，无需中间人，几乎不需要交易费。它背后的技术实现是很巧妙的通过将造币(Mint)，交易(transaction，这里提到的交易都是特指的支付)，交易验证(transaction verifiction)交织在一起，形成一个完美的圆。所以要想把它的机理理解清楚，就必须同时理解bitcoin的电子货币，交易，造币的确切含义。&lt;br /&gt;
&lt;br /&gt;
首先从电子货币谈起。&lt;br /&gt;
&lt;br /&gt;
== 电子货币和交易单(Transaction)  ==&lt;br /&gt;
&lt;br /&gt;
Bitcoin电子货币解决的是：&lt;br /&gt;
&lt;br /&gt;
* 任意造币的问题：通过“挖矿”机制保证了不能任意造币。&lt;br /&gt;
* 重复花钱的问题(Double-Spending)：利用P2P网络，通过HashCash的机制。&lt;br /&gt;
&lt;br /&gt;
事实上Bitcoin系统中不存在独立的电子货币，货币值是依附于交易单存在的，所以在bitcoin中的电子货币的实质就是交易单，确切的说是货币交易（Transactions）的 数字签名链，它的数字签名算法使用的是ECDSA（椭圆曲线数字签名算法 secp256k1曲线）进行签名的。&lt;br /&gt;
&lt;br /&gt;
交易单的数据如下：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In:&lt;br /&gt;
Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd0&lt;br /&gt;
4470b9a6&lt;br /&gt;
Index: 0&lt;br /&gt;
scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446&lt;br /&gt;
618c4571d1090db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fd&lt;br /&gt;
d7d5d6cc8d25c6b241501&lt;br /&gt;
&lt;br /&gt;
Out:&lt;br /&gt;
Value: 5000000000&lt;br /&gt;
scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35&lt;br /&gt;
549d OP_EQUALVERIFY OP_CHECKSIG&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
交易单记录的是本次交易的收入来源(in)和支出(out)。当你支出（给）一笔钱的时候，首先在交易单中就要描述清楚你要支出(out)的钱的收入来源(in)，然后在支出(out)项中，指明要支出的金额，以及通过脚本的形式写明接收者的公钥，然后用自己的私钥签名(scriptSig)认可该笔交易，最后将交易单广播到网络。&lt;br /&gt;
&lt;br /&gt;
=== 收入来源(in) ===&lt;br /&gt;
&lt;br /&gt;
* Previous tx: 为收入来源交易单的散列值，也就是待支付的钱是谁给你的，经常会有多个收入来源被列在交易单中&lt;br /&gt;
* index: 指明是收入来源交易单中具体哪一个out，也就是Previous tx交易单中的out索引值（因为out也可以有多个）。&lt;br /&gt;
* scriptSig: 拥有者对该交易的ECDSA签名认可。&lt;br /&gt;
&lt;br /&gt;
=== 接收对象(out) ===&lt;br /&gt;
&lt;br /&gt;
* Value: 发送的币值，以Satoshi 为单位，1BTC = 100,000,000 Satoshi&lt;br /&gt;
* scriptPubKey: 接收方的公钥脚本。&lt;br /&gt;
&lt;br /&gt;
=== in与out的关系： ===&lt;br /&gt;
&lt;br /&gt;
* 每一笔交易，out的总额应该等于in的总额。但是，在这个交易单里，只会有out的Value，没有in的Value，而是通过in的Pervious与index，追溯到上一个交易单的某一个out，获得Value。&lt;br /&gt;
* 一次send bitcoin，剩下的钱，应该out给自己，否则这个钱就丢了。&lt;br /&gt;
&lt;br /&gt;
=== 情况列举： ===&lt;br /&gt;
&lt;br /&gt;
* 我有10个BTC，是某一次交易获得的，我要送给朋友A，10个BTC。这时候，有一个in，一个out。&lt;br /&gt;
* 我有10个BTC，是某一次交易获得的，我要送给朋友A，5个BTC，这时候，有一个in，两个out，一个指向朋友5个BTC，一个指向我自己，得到剩下的5个BTC。&lt;br /&gt;
* 我有10个BTC，是以前的两次交易获得的，我要送给朋友A，10个BTC，这时候，有两个in，一个out。&lt;br /&gt;
* 我有10个BTC，是以前的两次交易获得的，其中一次获得了6个BTC，另一次获得了4个BTC，我要送给我的朋友7个BTC，这时候，有两个in，两个out。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// An input of a transaction.  It contains the location of the previous&lt;br /&gt;
// transaction&#039;s output that it claims and a signature that matches the&lt;br /&gt;
// output&#039;s public key.&lt;br /&gt;
//&lt;br /&gt;
class CTxIn&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    COutPoint prevout;&lt;br /&gt;
    CScript scriptSig;&lt;br /&gt;
    unsigned int nSequence;&lt;br /&gt;
    ....&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//&lt;br /&gt;
// An output of a transaction.  It contains the public key that the next input&lt;br /&gt;
// must be able to sign with to claim it.&lt;br /&gt;
//&lt;br /&gt;
class CTxOut&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    int64 nValue;&lt;br /&gt;
    CScript scriptPubKey;&lt;br /&gt;
    ....&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//&lt;br /&gt;
// The basic transaction that is broadcasted on the network and contained in&lt;br /&gt;
// blocks.  A transaction can contain multiple inputs and outputs.&lt;br /&gt;
//&lt;br /&gt;
class CTransaction&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    int nVersion;&lt;br /&gt;
    std::vector&amp;lt;CTxIn&amp;gt; vin;&lt;br /&gt;
    std::vector&amp;lt;CTxOut&amp;gt; vout;&lt;br /&gt;
    unsigned int nLockTime;&lt;br /&gt;
 &lt;br /&gt;
    ....&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
每一笔交易单验证追查到最后，第一笔总是“挖矿”所得，这被称为coinbase。&lt;br /&gt;
如果是第一次“挖矿”所得，电子货币的内容用JSON格式表示如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;hash&amp;quot;:&amp;quot;b3141455cb397e42665b90b3726c4770fd36101715618718111403bc780ceaa2&amp;quot;,&lt;br /&gt;
  &amp;quot;ver&amp;quot;:1,&lt;br /&gt;
  &amp;quot;vin_sz&amp;quot;:1,&lt;br /&gt;
  &amp;quot;vout_sz&amp;quot;:1,&lt;br /&gt;
  &amp;quot;lock_time&amp;quot;:0,&lt;br /&gt;
  &amp;quot;size&amp;quot;:135,&lt;br /&gt;
  &amp;quot;in&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;prev_out&amp;quot;:{&lt;br /&gt;
        &amp;quot;hash&amp;quot;:&amp;quot;0000000000000000000000000000000000000000000000000000000000000000&amp;quot;,&lt;br /&gt;
        &amp;quot;n&amp;quot;:4294967295&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;coinbase&amp;quot;:&amp;quot;042194261a02f200&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;out&amp;quot;:[&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;value&amp;quot;:&amp;quot;50.01000000&amp;quot;,&lt;br /&gt;
      &amp;quot;scriptPubKey&amp;quot;:&amp;quot;0452d1a02ffeacfc0c78fcf2ceeaf04d5416c15af1c65da13d9cdaa56844c825c1aa2f540e9439bf38a43419002d8441eea627cb56d6ed51e7848da5c3f6eee6ec OP_CHECKSIG&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
每一笔交易都会向整个P2P网络广播该货币的交易记录。通过投票机制，来决定该支付交易是否正常。如节点认为该交易记录是正常的那么就通过CPU计算POW(Proof-of-Work),然后广播，其它节点收到这个POW可以继续投票，形成Block 链（见挖矿）。如果节点收到不一致的两个交易记录，那么只信任链最长的。如果一笔Bitcoin被支出两次的情况广播出来，那么某些节点将先看到它第一次发生的支付交易，其他节点则看到的是它第二次发生的支付交易。究竟是哪一个支付交易“赢”了，则是由恰好创建了下一个block的那个节点来决定 —— 无论是哪个节点找到了“小的散列值”， 它的block中包含的那个支付交易被判断为有效的，其他的支付交易被视为无效。&lt;/div&gt;</summary>
		<author><name>Riceball</name></author>
	</entry>
</feed>