开源 Bitcoin P2P电子货币系统背后的技术(二)

Unknown view 45 2014-2-19 02:11
share to
Scan QR code with WeChat

开源 Bitcoin P2P电子货币系统背后的技术(二)

Bitcoin 电子货币系统的核心功能是面对面(点对点)支付,就像真实货币一样,无需中间人,几乎不需要交易费。它背后的技术实现是很巧妙的通过将造币(Mint),交易(transaction,这里提到的交易都是特指的支付),交易验证(transaction verifiction)交织在一起,形成一个完美的圆。所以要想把它的机理理解清楚,就必须同时理解bitcoin的电子货币,交易,造币的确切含义。

首先从电子货币谈起。

电子货币和交易单(Transaction)

Bitcoin电子货币解决的是:

任意造币的问题:通过“挖矿”机制保证了不能任意造币。

重复花钱的问题(Double-Spending):利用P2P网络,通过HashCash的机制。

事实上Bitcoin系统中不存在独立的电子货币,货币值是依附于交易单存在的,所以在bitcoin中的电子货币的实质就是交易单,确切的说是货币交易(Transactions)的 数字签名链,它的数字签名算法使用的是ECDSA(椭圆曲线数字签名算法 secp256k1曲线)进行签名的。

交易单的数据如下:

In:

Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd0

4470b9a6

Index: 0

scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446

618c4571d1090db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fd

d7d5d6cc8d25c6b241501

Out:

Value: 5000000000

scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35

549d OP_EQUALVERIFY OP_CHECKSIG

交易单记录的是本次交易的收入来源(in)和支出(out)。当你支出(给)一笔钱的时候,首先在交易单中就要描述清楚你要支出(out)的钱的收入来源(in),然后在支出(out)项中,指明要支出的金额,以及通过脚本的形式写明接收者的公钥,然后用自己的私钥签名(scriptSig)认可该笔交易,最后将交易单广播到网络。

收入来源(in):

Previous tx: 为收入来源交易单的散列值,也就是待支付的钱是谁给你的,经常会有多个收入来源被列在交易单中

index: 指明是收入来源交易单中具体哪一个out,也就是Previous tx交易单中的out索引值(因为out也可以有多个)。

scriptSig: 拥有者对该交易的ECDSA签名认可。

接收对象(out):

Value: 发送的币值,以Satoshi 为单位,1BTC = 100,000,000 Satoshi

scriptPubKey: 接收方的公钥脚本。

in与out的关系:

每一笔交易,out的总额应该等于in的总额。但是,在这个交易单里,只会有out的Value,没有in的Value,而是通过in的Pervious与index,追溯到上一个交易单的某一个out,获得Value。

一次send bitcoin,剩下的钱,应该out给自己,否则这个钱就丢了。

情况列举:

我有10个BTC,是某一次交易获得的,我要送给朋友A,10个BTC。这时候,有一个in,一个out。

我有10个BTC,是某一次交易获得的,我要送给朋友A,5个BTC,这时候,有一个in,两个out,一个指向朋友5个BTC,一个指向我自己,得到剩下的5个BTC。

我有10个BTC,是以前的两次交易获得的,我要送给朋友A,10个BTC,这时候,有两个in,一个out。

我有10个BTC,是以前的两次交易获得的,其中一次获得了6个BTC,另一次获得了4个BTC,我要送给我的朋友7个BTC,这时候,有两个in,两个out。

/

// An input of a transaction. It contains the location of the previous

// transaction's output that it claims and a signature that matches the

// output's public key.

//

class CTxIn

{

public:

COutPoint prevout;

CScript scriptSig;

unsigned int nSequence;

....

}

//

// An output of a transaction. It contains the public key that the next input

// must be able to sign with to claim it.

//

class CTxOut

{

public:

int64 nValue;

CScript scriptPubKey;

....

}

//

// The basic transaction that is broadcasted on the network and contained in

// blocks. A transaction can contain multiple inputs and outputs.

//

class CTransaction

{

public:

int nVersion;

std::vector<CTxIn> vin;

std::vector<CTxOut> vout;

unsigned int nLockTime;

....

每一笔交易单验证追查到最后,第一笔总是“挖矿”所得,这被称为coinbase。

如果是第一次“挖矿”所得,电子货币的内容用JSON格式表示如下:

{

"hash":"b3141455cb397e42665b90b3726c4770fd36101715618718111403bc780ceaa2",

"ver":1,

"vin_sz":1,

"vout_sz":1,

"lock_time":0,

"size":135,

"in":[

{

"prev_out":{

"hash":"0000000000000000000000000000000000000000000000000000000000000000",

"n":4294967295

},

"coinbase":"042194261a02f200"

}

],

"out":[

{

"value":"50.01000000",

"scriptPubKey":"0452d1a02ffeacfc0c78fcf2ceeaf04d5416c15af1c65da13d9cdaa56844c825c1aa2f540e9439bf38a43419002d8441eea627cb56d6ed51e7848da5c3f6eee6ec OP_CHECKSIG"

}

]

}

每一笔交易都会向整个P2P网络广播该货币的交易记录。通过投票机制,来决定该支付交易是否正常。如节点认为该交易记录是正常的那么就通过CPU计算POW(Proof-of-Work),然后广播,其它节点收到这个POW可以继续投票,形成Block 链(见挖矿)。如果节点收到不一致的两个交易记录,那么只信任链最长的。如果一笔Bitcoin被支出两次的情况广播出来,那么某些节点将先看到它第一次发生的支付交易,其他节点则看到的是它第二次发生的支付交易。究竟是哪一个支付交易“赢”了,则是由恰好创建了下一个block的那个节点来决定 —— 无论是哪个节点找到了“小的散列值”, 它的block中包含的那个支付交易被判断为有效的,其他的支付交易被视为无效。

转自http://www.showmuch.com/a/20110601/000911.html

作者:李雪愚

btcfans公众号

Scan QR code with WeChat

From the Internet
Disclaimer:

Previous: 开源 Bitcoin P2P电子货币系统背后的技术(一) Next: 开源 Bitcoin P2P电子货币系统背后的技术(三)

Related