使用 Swift 和 Vapor 构建区块链 Web API
使用 Swift 和 Vapor 构建区块链 Web API
原文:https://medium.com/hackernoon/building-blockchain-web-api-using-swift-and-vapor-2daf599c8449

http://media2.govtech.com/images/940*464/shutterstock_blockchain.jpg
更新:我很自豪地宣布,我的新课程“区块链 使用 Swift 在 iOS 中编程”现已推出。立即注册,仅需 10.99 美元。
在我的上一篇帖子中,我用 Swift 语言讨论了区块链的基本实现。在这篇文章中,我将使用服务器端 Swift 框架 Vapor 将区块链实现到云中。我们将在 HTTP 协议上构建区块链 Web API,使用不同的路径提供必要的功能。这篇文章假设你已经在电脑上安装了 Vapor 框架,并且具备 Swift 语言的基础知识。
实现模型
第一步是为区块链 Web API 创建必要的模型。这些模型将包括以下内容。
块:一个块类代表一个单独的块,它可以包含由事务表示的输入和输出。
块类的属性解释如下:
- 索引— 区块在区块链中的位置。索引为 0 意味着该块是区块链中的第一块。指数为 1 表示它是区块链中的第二个区块..你的想法是对的!
- 创建日期 —创建块的日期
- previousHash —前一个块的哈希值
- 哈希 —块的当前哈希
- 消息 —附在每个块上的备忘录。这只是为了我们的目的
- nonce —自动递增的数字,在挖掘散列时起着重要作用
- 事务 —事务的数组。每笔交易都代表一次货物/价值的转移
- 关键字 —这是传递给哈希函数的计算属性
交易:交易由汇款人、收款人和转账金额组成。实现如下所示:
事务类是不言自明的。它由起始、终止和金额字段组成。为了简单起见,我们将对 from 和 to 字段使用虚拟名称,实际上这些字段将由 wallet ID 组成。
区块链:区块链是表示区块列表的主类。每个块都指向链中的前一个块。每个块可以包含多个交易,代表贷项或借项。
每个模型都遵循可编码协议,这使得它可以很容易地转换成 JSON 表示的对象。如果您已经阅读了的上一篇文章,那么上面的实现非常相似。下一步是为我们的 Web API 配置路由,这是在新的章节中使用 Vapor 框架实现的。
使用 Vapor 实现 Web API
使用 Vapor 实现 Web API 有几种不同的方式。我没有在 Routes 类中添加所有代码,而是添加了一个自定义控制器来处理所有的区块链请求。区块链控制器的实现如下所示:
我们将从 Web API 的三个基本端点开始。
- 挖掘:这个端点将启动挖掘过程。挖矿会让我们满足工作证明,把区块加入区块链。
- 事务:该端点用于添加一个新的事务。交易将包含关于发送者、接收者和金额的信息。
- 区块链:这个端点返回完整的区块链。
区块链控制器使用区块链服务来执行所需的操作。BlockChainService 的实现如下所示:
让我们来看看 Web API 端点。启动 Vapor 服务器,并向“ mine ”端点发送请求。

Mining a New Block
工作证明算法生成一个以“ 000 ”开始的哈希值。一旦块被挖掘出来,我们就通过将它转换成 JSON 格式来返回它。这是通过使用 Swift 4.0 可编码协议来执行的。
现在,我们可以将事务添加到区块链中。这是一个简单的交易,从亚历克斯向玛丽转账 10 美元。

New Transaction
最后一步是用新添加的块检查我们的区块链。访问端点“区块链”查看完整的链。

Blockchain
万岁!我们的区块链 Web API 现在工作正常。
不幸的是,区块链的要点是去中心化,目前,我们没有任何机制来添加新的节点。在下一节中,我们将更新我们的区块链实现,以便它可以支持多个节点。
向区块链添加节点
在允许区块链添加新节点之前,我们必须定义一个节点是什么样子的。节点模型的实现如下所示:
BlockChainNode 类只包含一个代表节点服务器 URL 的地址属性。我们更新了 BlockchainController,添加了注册新节点的功能。如下所示:
BlockchainService 也会得到更新,以适应新节点的注册。
让我们继续进行测试。启动新的 Vapor 服务器并尝试注册新节点。

Register a New Node
一旦注册了节点,您就可以使用节点端点获取它,如下所示:

Fetching All Nodes
现在,我们可以注册新节点了,我们应该集中精力解决节点之间的冲突。当一个节点上的区块链比其他节点大时,就会发生冲突。在这种情况下,我们总是采用相邻节点并用较大的区块链更新它们。
解决节点之间的冲突
为了产生冲突,我们需要运行第二台服务器或在单独的端口上运行服务器。我们将使用后一种方法,在不同的端口上启动 Vapor 服务器。两个节点启动后,我们将在两个节点上创建事务,这将向区块链添加数据块。最后,我们将调用一个 resolve 端点来解决节点之间的冲突,并将节点更新到更大的区块链。
BlockchainController 已更新,添加了用于解决冲突的新端点。
我们使用了 Vapor 框架的异步响应特性,这将允许我们异步处理响应。BlockchainService 也已更新,以支持冲突解决。实现如下所示:
resolve 函数遍历节点列表并获取每个节点的区块链。如果区块链大于当前的区块链,那么它会用较大的那个替换区块链,否则它会返回当前的区块链,也是较大的那个。
为了进行测试,让我们在不同的端口上启动两个服务器,并在端口 8080 上添加两个事务,在 8090 上添加三个事务。您可以通过发出以下命令,使用终端启动 Vapor 服务器。
vapor run serve -— port=8090
我们在端口 8080 节点上添加了三个事务,如下所示:

Blockchain on Port 8080
之后,我们在端口 8090 节点上添加了两个事务,如下所示:

Blockchain on Port 8090
确保使用 8090 地址注册节点,如下所示:

Registering a Node
最后,是时候测试我们解决冲突的终点了。通过在您的 Postman 中访问“ resolve ”端点来调用它,如下所示:

Resolve End Point Returning Larger Blockchain
如您所见,解析端点返回较大的区块链,并更新其他节点的区块链。这就完成了我们的冲突解决场景。
[ Github ]
这篇文章基于 Daniel Van Flymen 的一篇精彩文章“通过建造一个来了解区块链”。
我希望你喜欢这个帖子。我目前正在制作一个 Udemy 课程,主题是“iOS 中的区块链编程”。你可以点击这里订阅课程发布时的通知。
如果你想支持我的写作和捐赠,请访问我的课程页面,在 Udemy 上购买我的精彩课程。
谢谢,祝编程愉快!