美文网首页
深入浅出比特币源码(2)

深入浅出比特币源码(2)

作者: 量子位 | 来源:发表于2018-10-09 00:57 被阅读0次

    通过调试理解代码

    bitcoin-msvc版本可以在https://github.com/kobake/bitcoin-msvc 拉下来,msvc用来调试程序真的非常好。可以从main一直跟踪,也可以从常用的rpc作为突破口。常用rpc可以通过bitcoin-cli help获取到,也可以在代码里搜索”static const CRPCCommand commands[] =“,rpc接口都放在这样的一个数组里。以bitcoind -regtest启动bitcoind,然后可以bitcoin-cli -regtest help获取帮助信息,会返回所有的rpc接口。常用的rpc接口有

    挖矿generate

    发送交易sendtoaddress

    获取一个地址getnewaddress

    获取节点的信息getinfo

    关于挖矿的理解

    目前为止,主流的挖矿共识算法有pow和pos,也就是工作量证明和权益证明。通过挖矿的机制,限定单位时间被创建块的数量。试想一下,任何人都可以把交易打包,然后创建一个新块,那网络上就有可能有非常多的块,然后所有的节点只能逐一对比各个块,那个更难度更大。这样会造成分叉非常多,达成共识困难。于是,中本聪想了非常好的办法,工作量证明,谁产生的block的hash小于某个数,就认为他是有效的块。怎么让block的hash足够小,只能通过修改block的数据,比如nNonce、nTime等值,然后算一下是否满足,如此循环。因为现在还没办法预先设定hash,然后在算出怎么构造这个block来符合这个hash。只通过这种蛮力的修改计算,把不符合条件的块筛选掉,把分叉控制在小范围。另外加入算力控制,链上是很大的算力总和,如果想修改链上数据,也得付出重大的算力,几乎不大可能。

    pos算法,用的是类似股权证明的算法,因为像比特币这种加密货币,它的余额是通过输出来表示,每个输出理解为一个coin,然后看谁拥有的币越多,币的年龄越老,谁就越有机会挖到块。

    比特币的脚本系统

    比特币实现了一个操作符非常有限的脚本系统,它提供的操作符可以在script.h看到。它是一个基于堆栈式的脚本系统,脚本的解析执行在interpreter.cpp中的EvalScript。脚本就是用来锁币和解锁币。

    锁币的脚本类型在standard.cpp中的GetTxnOutputType定义:

    锁币的脚本类型

    支付到公钥、公钥hash、多重签名([n,m]个签名)的脚本模板。这三个也就是比特币常用的支付脚本。

    脚本模板

        支付到公钥:CTxOut的scriptPubKey脚本压入了公钥和操作符OP_CHECKSIG,然后在用到这个CTxOut的时候,也就是在CTxIn的scriptSig压入用私钥对交易数据的签名。验证的时候,脚本系统先分析CTxIn的scriptSig脚本,并把执行结果压栈,这里是把签名数据压栈,然后运行CTxOut的脚本,OP_PUBKEY是公钥占位符,即把公钥压栈,现在的堆栈情况是

    支付到公钥,执行到OP_CHECKSIG前的堆栈

    然后我们interpreter.cpp中关于OP_CHECKSIG的运行代码

    操作符OP_CHECKSIG的代码

    884和885分别从堆栈获取签名和公钥数据,后面代码就是用公钥验证签名是否正确。

    支付到公钥的hash:CScript() << OP_DUP << OP_HASH160 << OP_PUBKEYHASH << OP_EQUALVERIFY << OP_CHECKSIG, OP_PUBKEYHASH是公钥hash的数据占位符,其他是操作码,CTxIn的scriptSig侧需要压入签名和公钥(因为锁定脚本里只有公钥的hash无法验证签名是否正确,而且只根据公钥的hash是无法反算出原公钥。支付到公钥hash比支付到公钥的好处是在没花费这个币之前,公钥对其他人也是不可见的)。然后OP_DUP对栈顶的公钥进行复制到栈顶,OP_HASH160对复制出来的公钥对hash,并将hash值替换复制的值。OP_PUBKEYHASH(占位符)对应的公钥hash压栈,OP_EQUALVERIFY对栈顶的两个公钥hash比较,并把它们出栈,最后OP_CHECKSIG和前面的支付到公钥的情况一样了。

    我的比特币地址: 1Nt5fMXqy5SFrFUAc3YQsFfeVEYb1hxeWK

    相关文章

      网友评论

          本文标题:深入浅出比特币源码(2)

          本文链接:https://www.haomeiwen.com/subject/fykraftx.html