写在前面
这篇博客主要总结一下之前做过的区块链作业中的一些有趣的东西。
实验环境搭建
按照老师的要求以及助教给的一些问题的解决方案。把python从3.8装回3.7再装回3.6,好像都没什么用。在pycharm运行代码总是说缺少依赖,然而明明已经装过了,点击它给的解决方案安装依赖,然后安装失败。于是我灵机一动,把之前装过的都卸掉了,再点那个安装,还是失败,于是我打开里面的虚拟终端通过命令行来安装。终于不提示缺少依赖。然而运行的时候,提示我的python-bitcoinlib库有问题,点进去查看源码依然毫无头绪。然后打开了虚拟机里的Ubuntu,安装依赖后可以跑代码。于是我的环境终于有了。
领取测试币
进到比特币测试网络领取比特币,在找完公交车或者自行车以及斑马线之后总是卡住不同,于是挂vpn再访问终于施舍给了我点币子。
比特币脚本(暂时了解的)
比特币脚本语言是一种基于栈的脚本语言(每个命令只执行一次),不是图灵完备的。比特币脚本包含两个部分,解锁脚本+锁定脚本,连在一起才是完整的,运行正确之后在栈中返回一个Ture。
公钥支付 P2PK (Pay to Publish Key)
锁定脚本
<pubkey> #公钥
OP_CKECKSIG #验证签名的脚本语言
解锁脚本
<Sig> #签名
OP_CKECKSIG
的部分函数定义,大致看起来就是利用pubkey
生成一个数字签名,再与输入的签名比较,最后如果是ok
就会在栈里留下一个Ture
def _CheckSig(sig, pubkey, script, txTo, inIdx, err_raiser):
key = bitcoin.core.key.CECKey()
key.set_pubkey(pubkey)
if len(sig) == 0:
return False
hashtype = _bord(sig[-1])
sig = sig[:-1]
(h, err) = RawSignatureHash(script, txTo, inIdx, hashtype)
return key.verify(h, sig)
-------------------------------------------------------
elif sop == OP_CHECKSIG or sop == OP_CHECKSIGVERIFY:
check_args(2)
vchPubKey = stack[-1]
vchSig = stack[-2]
tmpScript = CScript(scriptIn[pbegincodehash:])
tmpScript = FindAndDelete(tmpScript, CScript([vchSig]))
ok = _CheckSig(vch