比特币原理示例程序,参考《一个故事告诉你比特币的原理及运作机制》实现。
可以认为比特币是一种分布式投票系统,某个用户发起议案,经大量用户表决确认后议案通过;议案以及表决消息需要经过签名以及验证,以保证来源可靠、未被篡改;需要一个系统来实现用户间的通信。根据这几点,代码分布到以下几个目录中:
- meeting 定义了议案以及表决。
- cryptology 实现证书、密钥文件的加载以及签名验证等功能。
- router 实现消息广播。
- core 比特币核心实现。
- m.go 示例代码,编译成可执行程序。
- 客户端调用 core/interface.go 中的接口发起请求,请求被包装成议案,发送到议案通道(user.proposal_chnl)
- core/user.go 中的 user::run 方法从通道收到议案,将议案广播出去。上文说过,比特币是一种分布式投票系统,所以需要将每个议案广播出去,让每个在线的用户对议案进行表决。
- core/broadcast.go 中的代码处理广播,包括发送广播、接收广播。收到议案广播后调用user::onProposal进行处理。
- core/proposal.go 中的代码处理议案。user::onProposal首先对议案进行签名验证,然后调用不同的函数对不同的议案进行处理。议案处理函数完成处理后调用user::sendDecide()广播表决。
- core/decide.go 中的代码处理表决。user::onDecide()函数在收到表决广播的时候被调用,函数首先验证表决消息的签名,然后根据收到的不同表决进行不同的处理。如果过半数的在线用户同意或者否决议案,则认为议案通过或者失败,分别调用相应的处理函数。
- 实用的系统应该是分布式的,由多个组件组成,后续会修改代码逐步实现实用化。如使用gRPC来进行多个用户间的通信,使用protocol buffers定义用户间交换的消息。
- 编译方法
- 从 github 下载代码后,先使用 godep restore 获取第三方依赖库
- 再执行 go build github.com/yaozijian/bitcoin 进行编译