如何使用超级账本创建一条区块链

我们在这篇文章中将讲述如何使用超级账本Composer创建一个数字银行。这个数字银行会有用户和账户,并且在最后,你还将能够在区块链上转移资金和记录所有交易。我们同时还将公开一个 RESTful API ,从而即使一个不知道什么是区块链的人,也可以在它周围建立一个漂亮的用户界面(UI)。我们还将在Angular中创建这个应用的UI。

我非常兴奋能和你分享这个一步步的指南。所以我们马上开始吧!

当我第一次编写这个代码时,我遇到了错误,很多很多。但我认为那很好,因为这让我学到了很多东西。错误是必不可少的。我认为错误和曲折会使事情变得更好。这几乎使我失去理智,但这对一个黑客的生涯来说是不可或缺的一部分。

在开始之前,您需要确保所使用的机器配备了所需的配置。您可能需要下载某些必备软件并设置一个基本的开发环境。下面的链接可以告诉你怎么做。在开始开发应用程序之前,请遵循这些步骤,否则您肯定会遇到愚蠢的错误。

首先安装超级账本Composer。然后安装开发环境。

安装开发环境时不需要启动Playground。

当你运行 ./startFabric.sh 时,确保docker也正在运行。这个过程需要几分钟完成,请耐心等待。

设备现在已经安装好了,我们就可以开始编码了!

步骤1:概述您的业务网络。

我们的业务网络定义(BND)包括数据模型、交易逻辑和访问控制规则。数据模型和访问控制规则是用特定领域的语言编写的(很简单就能跟上)。交易逻辑将用javascript编码。

要想创建一个BND,我们需要在磁盘上创建一个合适的项目结构。我们将使用Yeoman创建一个基本的业务网络。若要创建项目结构,请打开终端并运行以下命令:

$ yo hyperledger-composer

这将遇到一系列问题,如下所示。你需要使用你的方向键来在答案中进行导航。

3

使用你最擅长的文本编辑器中打开这个项目。本文中我使用的是Visual Code。下图便是这个文件结构的样式:

4

删除test/logic.js中的内容。我们现在用不到它。

步骤2.1:编写业务网络代码(models/test.cto)

首先,我们将定义models/test.cto。它包含业务网络中所有资产、参与者和交易的类定义。这个文件是以超级账本Composer建模语言编写的。

namespace test asset Account identified by accountId { o String accountId --> Customer owner o Double balance } participant Customer identified by customerId { o String customerId o String firstName o String lastName } transaction AccountTransfer { --> Account from --> Account to o Double amount }

Account (账户)是一种与 accountId 独一无二地相对应的资产。每一个 Account 都与 Customer (客户)相连, Customer 是账户的 owner (所有者)。 Account 具有 balance (余额)属性,可以随时显示这个 Account 所持有的资金多少。

Customer 是一个与 accountId 独一无二地相对应的参与者。每一个 Customer 都有 firstName (名)和 lastName (姓)。

AccountTransfer 是在 Account 中从 tofrom 之间发生的交易。 Amount 则存储的是转移的资金多少。

步骤2.2:编写业务网络代码(lib/logic.js)

在这个文件中,我们将在javascript中添加交易逻辑。

/** * Sample transaction * @param {test.AccountTransfer} accountTransfer * @transaction */ function accountTransfer(accountTransfer) { if (accountTransfer.from.balance < accountTransfer.to.balance) { throw new Error ("Insufficient funds"); } accountTransfer.from.balance -= accountTransfer.amount; accountTransfer.to.balance += accountTransfer.amount; return getAssetRegistry('test.Account') .then (function (assetRegistry) { return assetRegistry.update(accountTransfer.from); }) .then (function () { return getAssetRegistry('test.Account'); }) .then(function (assetRegistry) { return assetRegistry.update(accountTransfer.to); }); }

@param {test.AccountTransfer} accountTransfer 是我们放在这个文件顶端来将这笔交易与我们的JavaScript函数连接在一起的装饰模式。然后我们验证资金所在的账户是否有足够的资金。否则,程序将抛出错误。然后,我们对帐户的余额进行基本的加减。

此时,最重要的一步是更新区块链上的内容。

对此,我们将调用我们资产(也就是Account)的 getAssetRegistry API 。然后我们为收取资金的账户和发出资金的账户 update (更新)被检索到的 assetRegistry

步骤3:生成业务网络存档 (BNA)

业务网络被定义过后必须打包到一个可部署的业务网络存档(.bna)文件。

步骤3.1:导航到终端中的test-bank App中。

步骤3.2:运行以下命令:

$ composer archive create -t dir -n .

这将在test-bank文件夹中创建一个.bna文件。

5|1138x568

步骤4:在Fabric上部署业务网络存档文件。

步骤4.1:安装composer runtime

$ composer runtime install --card [email protected] --businessNetworkName test-bank

步骤4.2:部署业务网络

$ composer network start --card [email protected] --networkAdmin admin --networkAdminEnrollSecret adminpw --archiveFile [email protected] --file networkadmin.card

(确保你进入了test-bank文件夹)

6|1156x508

步骤4.3:导入网络管理员身份作为可用的业务网络卡片

$ composer card import --file networkadmin.card

YRqgNvRjG4sA|1152x288

步骤4.4:检查业务网络是否已成功部署,请运行以下命令行ping这个网络:

$ composer network ping --card [email protected]

8|1156x264

步骤5:公开一个RESTful API

要从命令行创建RESTful API,请运行以下命令:

$ composer-rest-server

这会产生很多问题。

9|1156x610

现在使用浏览器打开http://localhost:3000/explorer

您将看到您漂亮的区块链API。

10

现在让我们添加两个客户(Customer)。

首先,让我们添加一个叫Niharika Singh的客户:

11|1600x840

我们得到了200个响应代码。

现在我们将以类似的方法添加一位叫Tvesha Singh的客户。

若要检查是否正确添加了它们,请获取(GET)它们。

12|1600x756

你会在响应体中看到两个客户。

现在,让我们添加两个与这两个客户相关的帐户(account)。

13|1600x845

以这种方式添加账户。现在,通过获取账户来检查你是否添加成功。

14|1600x758

现在让我们从Niharika向Tvesha转账75。

15|1600x841

让我们通过获取帐户信息看看余额是否更新了。

17|1600x768

太棒了,成功了。Niharika现有有了25,而Tvesha有125。

步骤6:Angular前端

要自动创建Angular脚手架,请在test-bank文件夹中运行以下命令:

$ yo

这将涉及多个问题。

18|1164x652

需要几分钟。

进入 bank-app。

$ npm start

Angular服务器将启动。

19|1446x484

Angular文件结构如下所示:

20

使用浏览器打开http://localhost:4200。魔法就在这里发生!你会在屏幕上看到以下内容:

21|1600x565

现在通过界面右上部进入Assets并点击Account。

22

这些便是我们创建的账户。

现在你自己动手可以尝试一下了。

准备好你的前端和后端!

所有发生在localhost:3000上的交易都将反应在localhost:4200上,反之亦然。而这全都在区块链上。