比特币(区块链)系统

题目要求:用Go实现一个简单的比特币系统

包括挖矿过程,如何判断区块合法,如何打包区块,如何发起交易等。

核心的逻辑可以用流程图或伪代码来描述。

整个系统至少包括两个节点,一个客户。

1、每个节点包含如下两个程序:

1)挖矿程序:挖矿,通知主程序挖矿结果

2)主程序

a.接收本节点挖矿结果,判断该结果是否之前已经被发布过,若没有被本节点或其他节点作为nonce发布过,则进入打包区块环节;否则抛弃这个挖矿结果。

b.接收交易请求,存入本地交易池。

c.接收其他节点发来的区块,先检验该区块是否合法,若不合法则抛弃此区块;若合法,则保存此区块,并从本地交易池删掉已被打包的交易。

注意,检查区块是否合法至少应包括  i) nonce合法; ii)prevHash和前一区块的hash值是相等的。

d.打包区块,从交易池中选择一定数量的交易,构建区块并发送给其他节点

2、客户端

按一定时间间隔(比如10毫秒)给所有节点发送交易请求。

核心流程图:

整个过程中遇到的几个问题:

1、当节点几乎同时挖到矿的时候,怎么判断到底是谁?

在想这个问题的时候,想过使用最长链原则,但是由于我这里只有两个节点,所以不好使用。所以最后采用了这个方法:当一个节点挖到矿将该区块发给其他节点的时候,需要将挖到区块的时间一同发送过去。这样当其他区块对其进行验证时,需要比较自己挖到矿的时间,若自己挖到矿的时间早,就进行验证、加块操作。

2、多个协程的问题:

多个协程之间互相等待,以防止若主协程结束了,会影响其他协程。使用WaitGroup实现同步。

3、包导入的问题。

这个问题当时困扰了我很久。因为我没有使用go mod init ---初始化,导致无法正确的导入someCompose包。要注意,一定要在本包的目录下进行初始化。注意go.mod文件头部的package。一定要与包名对应。

4、读数据问题。

由于客户端发送的交易信息非常多,所以要使用循环读取的方法。一开始没有意识到这个问题,导致无法正确的对块进行解析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值