比特币(区块链)系统

题目要求:用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、读数据问题。

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

猜你喜欢

转载自blog.csdn.net/qq_56540305/article/details/134358122