让我们从为用户和矿工提供新服务开始。 它将是区块链和节点的其他两个服务的副本,但我们将放入新的控制器、服务和模型。 因为矿工是用户(即他们需要一个地址来包含在交易中),所以我们将从用户开始。 让我们创建一个端点来添加、列出和获取有关用户的信息。 我将使用基本身份验证 list
和 get
端点。 这 add
端点将是开放的,因为任何人都应该能够创建用户。
虽然我想演示某种级别的身份验证,但我不想陷入真正身份验证系统的细节中。 因此,为了模拟检查,用户名和密码必须相同,并且列出所有用户的特殊用户必须命名为admin。 如果启动时不存在管理员用户,我还将立即创建管理员用户。
这是我的控制器:
该服务非常简单:
使用 application.yaml
设置 MongoDB 的参数:
现在您可以使用 docker-compose.yaml
文件来启动 MongoDB 并测试新端点。 您应该能够向系统添加和列出用户。 请记住使用基本身份验证。 请务必记住,基本身份验证使用用户名,而端点使用 ID 进行更有效的搜索。
用户除了ID和名字之外还有什么? 在加密货币系统中,我们认为用户拥有一个钱包。 钱包是一个地址和一个私钥/公钥对。 在我们的系统中,我们将把它们折叠在一起,这样用户只能拥有一个“钱包”(即地址和私钥/公钥对)。 这样,用户就可以创建交易。 我们不能使用 ID 作为地址,因为每个用户都附加到一个节点,并且 ID 在节点之间不是唯一的。 因此我们将使用 UUID 作为地址。 然后只需创建私钥/公钥对即可。 这是更新的 UserService.addUser
:
因为我们不想暴露 privateKey
,我们将把这一行添加到任何链中 UserController
这将返回一个用户或用户列表:
.doOnNext(u -> u.setPrivateKey(null));
现在我们准备代表用户创建交易。
我们在区块链服务中有一个基本的交易创建端点,因此我们将删除它。 我们将保留添加事务端点,我们可以从用户服务中的新端点调用它。 控制器中的新端点如下所示:
新方法在 UserService
类看起来像这样:
您可以看到我们获取数据库中编码的私钥并使用它来签署输入合同。 就像我们创建的 withHash
方法,我们创建了 withSignature
方法,因为必须在应用数据后计算签名。 我们懒得检查输出地址,因为地址没有单一的真实来源。 某些加密货币使用一些特定的地址格式来帮助防止将硬币发送到不存在的地址,但无法确保您不会将硬币发送到众所周知的比特桶中。