比特币经过“挖矿”机制保证了不能任意造币。经过分布式网络和HashCash机制解决双重付出问题。事实上比特币体系中不存在独立的电子钱银,而只存在买卖单(账单),钱银值是依附于买卖单存在的,所以比特币中的电子钱银实质上买卖的账单记载的变化,确切的说是钱银买卖(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
https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
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
https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
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
https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
public:
int nVersion;
std::vector vin;
std::vector vout;
unsigned int nLockTime;
....
每一笔买卖单验证追查到最后,第一笔总是“挖矿”所得,这被称为coinbase。
假如是第一次“挖矿”所得,电子钱银的内容用JSON格式表明如下:
https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
"hash":"b3141455cb397e42665b90b3726c4770fd36101715618718111403bc780ceaa2",
"ver":1,
"vin_sz":1,
"vout_sz":1,
"lock_time":0,
"size":135,
"in":[
https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
"prev_out":https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
"hash":"0000000000000000000000000000000000000000000000000000000000000000",
"n":4294967295
},
"coinbase":"042194261a02f200"
}
],
"out":[
https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpg
"value":"50.01000000",
"scriptPubKey":"0452d1a02ffeacfc0c78fcf2ceeaf04d5416c15af1c65da13d9cdaa56844c825c1aa2f540e9439b f38a43419002d8441eea627cb56d6ed51e7848da5c3f6eee6ec OP_CHECKSIG"
}
]
}
每一笔买卖都会向整个P2P网络播送该钱银的买卖记载。经过投票机制,来决议该付出买卖是否正常。如节点以为该买卖记载是正常的那么就经过CPU核算 POW(Proof-of-Work),然后播送,其它节点收到这个POW能够继续投票,构成Block 链(见挖矿)。假如节点收到不一致的两个买卖记载,那么只信赖链最长的。假如一笔Bitcoin被开销两次的状况播送出来,那么某些节点将先看到它第一次 产生的付出买卖,其他节点则看到的是它第2次产生的付出买卖。究竟是哪一个付出买卖“赢”了,则是由刚好创建了下一个block的那个节点来决议 —— 无论是哪个节点找到了“小的散列值”, 它的block中包含的那个付出买卖被判断为有效的,其他的付出买卖被视为无效。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注