主页 > imtoken钱包最新版本下载 > 比特币优秀设计详解
比特币优秀设计详解
告诉我一些比特币使用的巧妙设计:
1、UTXO 模型。普通人在设计货币体系时,通常会使用账户体系,即一个账户对应一个余额。为方便介绍,下面给出交易的数据结构。
class COutPoint
{
public:
uint256 hash; //上一个交易的hash
uint32_t n; //hash对应的这个交易的vout的index
}
class CTxIn
{
public:
COutPoint prevout; //这个输入使用的那个交易的输出
CScript scriptSig; //签名
uint32_t nSequence;
CScriptWitness scriptWitness; // 隔离见证的签名
}
class CTxOut
{
public:
CAmount nValue;
CScript scriptPubKey; //输出锁定脚本
}
class CTransaction
{
public:
const std::vector vin;
const std::vector vout;
const int32_t nVersion;
const uint32_t nLockTime;
}
CTxOut 表示转账,带有金额和锁定脚本。锁定脚本有多种,可以简单的认为是支付给某个比特币地址。提供与该地址对应的签名的任何人都可以创建交易并将其用作输入以将其转移到任何输出。 UTXO 与现实中的硬币有些相似,只是 UTXO 具有任意面额(正确地大于灰尘值且小于比特币上限)。好处是它很容易跟踪,当然它的缺点是它没有匿名性。另一个优势是锁定脚本的多样性。
2、区块头。块和块体分开,便于同步传输。
class CBlockHeader
{
public:
// header
int32_t nVersion;
uint256 hashPrevBlock;
uint256 hashMerkleRoot;
uint32_t nTime;
uint32_t nBits;
uint32_t nNonce;
}
class CBlock : public CBlockHeader
{
public:
std::vector vtx;
}
区块的主要数据在交易中,区块头的数据只占80字节。区块头的哈希包括算力的验证。仅根据区块头,就可以判断数据是否合法,根据算力选择最长的链,再决定是否下载对应的区块数据(具体交易)。区块头数据小,即使传输数千个区块头,也能在极短的时间内完成。
3、区块链。区块通过hashPrevBlock字段链接形成链加入比特币的流程,hashPrevBlock指向前一个区块。链越长,积累的算力越大,越难篡改。
4、默克尔树。区块头不包含特定交易的数据。它如何保证交易数据不被修改?是的,它是 hashMerkleRoot 字段。它是交易数组vtx中所有交易的hash,将hash相邻的成对重复得到一个新数组,对这个新数组重复前面的操作,直到只剩下一个值。有兴趣的可以看看。
5、CoinBase 交易。既然一笔交易需要包含输入和输出,那么第一笔交易的输入从哪里来呢?比特币规定矿工可以在没有输入的区块内构造一笔交易,输出值等于区块奖励+区块内其他交易的手续费(输入减去输出的差额就是手续费),而把它放在 vtx 数组中。第一个位置。 CoinBase 交易的输出需要满足 100 个高度才能使用。
6、战栗。挖矿共识 工作量证明。矿工这么多加入比特币的流程,谁在说话?毕竟,挖矿区块有很多钱。生成 pow 共识以确定矿工。谁能够最快提供一个哈希值小于目标值的区块,这个区块就是他的。目前hash值只能靠硬碰,不断修改nNonce的值来尝试。目标值将不断调整。当计算能力增加时,块生成时间变得更快。目标值是控制10分钟左右的出块时间间隔,目标值变小。 block方法也可以解决双花问题。
7、区块链公理:任何依赖经济惩罚的共识都是垃圾。比特币的美妙之处在于它使用数学来保持区块链数据的正确性。一些区块链经常为区块安全添加经济惩罚机制,导致区块不安全。