如何编写和部署一个交易协议 | ArcBlock 博客

在我上一篇博客开发 DApp 前需要思考的 4 个问题 里,我和大家介绍了我的自动贩卖机 DApp 的模型,也和大家提到了我为此应用而全新定义的交易协议,叫做合并交易。而这段时间里,我一直忙于编写、部署我的交易协议,并且开始制作链下的模拟器。因此在这一篇博客里,我想跟大家简单的过一遍我们通过 ArcBlock 的 Forge 开发框架来编写和部署一个新的交易协议的编程步骤。

首先,我们来快速回顾一下我上期定义的合并交易:在我这个名叫自动贩卖机的信任账本的应用中,我只需要用区块链来完成账单的记录。因此,合并交易就是为了满足我这个需求。每当有新的账单时,自动贩卖机的钱包账户就会通过发送合并交易把账单的信息放到链上。当合并交易发送成功时,会自动更新和该笔账单有关的相关方的钱包账户里的利润金额。因此保证账单信息不可篡改、分成数据绝对真实。

如何编写和部署一个交易协议 | ArcBlock 博客

如何编写和部署一个交易协议 | ArcBlock 博客

那么,要编写、部署、以及使用这么一个交易,共有以下几个编程步骤:
第一步,发链。
通过 Forge 开发框架提供的工具 Forge CLI 就可以轻松的发链。通过forge start这个命令就会在本地启动一个节点。
第二步,编写新的交易协议。
编写新的交易协议,需要完成以四个文件:
•protocol.proto
protocol.proto 用于定义交易的数据结构,也就是一种类型的交易长什么样子,包含了什么信息。在 Forge 开发框架里,交易共分为内外两层,简单理解,外层(transaction)囊括了所有交易共有的信息(例如,该交易的发送者,发送时间)而内层(inner transaction)就是每个交易特有的信息。而我们通过 proto 文件就是定义这个内层 –inner transaction 的结构和内容。

如何编写和部署一个交易协议 | ArcBlock 博客

如何编写和部署一个交易协议 | ArcBlock 博客

•protocol.yml
我们是通过protocol.yml里定义的 pipeline 来告诉链应该如何处理这个新的交易协议。Forge 将处理交易的流程分成了三大步:
1.Check。就是当 Forge 节点收到交易时,会简单检查下有没有明显的问题 (例如,有没有信息是没有填写的)。
2.Verify。Verify 相较于 Check,是一个更加彻底的检查。通过 Verify 的交易可以被认定是完全没有问题的。
Check 和 Verify 就像我们在机场过安检时,都得经历的两个步骤:一个是检查一下你的证件和你的登机牌是否一致,另外就是你和行李都要通过 X 光被彻彻底底的检查,没问题后才可以登机。
3.Update。Update 会在交易被 Verify 后更新整个链上数据和状态。
Forge 开发框架提供了很多已经定义好的“pipe”,让开发者可以像搭积木一样随意组合搭配。但开发者也可以选择自定义新的 pipe,例如在 Update 这一步,因为不同的交易类型会 update 不同的数据,所以我们通常需要自定义这里的 pipe。

如何编写和部署一个交易协议 | ArcBlock 博客

•protocol.ex
我们通过protocol.ex来自定义 pipe。这个文件编程语言是 elixir,虽然看着有点眼生,但运用的逻辑却很简单。想了解更多 Elixir 的编程详情,请浏览我们的文档。
•config.yml
config.yml 记录了这个交易协议的基本信息。它把前三个文件串联在一起,供链来使用。并且,它包括了当前的版本数。每次修改协议内容时,都要更新当前的数字。如果我们忘记更改这个数字,当我们想要部署一个修改过的协议时就不会成功。

如何编写和部署一个交易协议 | ArcBlock 博客

第三步,部署交易协议。
这个步骤可以通过 Forge CLI 轻松完成。通过遵循我们文档提供的步骤,就可以部署交易协议到链上。
第四步,试用交易协议。
我们可以在 Forge 的 remote console 里试用我们新部署好的交易协议,这里用的是 Elixir SDK,使用起来也非常简单。但因为我更喜欢用 Python,所以这里将会展示用 Python SDK 试用的方法。用 Python SDK 试用主要分为三步:
•编译交易协议。通过 google 提供的缓冲编译器,我们就可以把我们的protocol.proto编译成 Python 支持的文件。
protoc -I=$SRC_DIR –python_out=$DST_DIR $SRC_DIR/protocol.proto
•创建钱包账户。我上期提到,钱包账户是链上所有活动交易的发起者和接收者。我们只需要知道对方的钱包地址,就可以和对方进行交易互动。因此,我要为自动贩卖机,也就是合并交易的发起方,和各位相关方,也就是接收方,各创建一个钱包账户。通过 Python SDK 创建钱包可以通过以下指令来完成。钱包的地址和余额也可以轻松的查看。
from forge_sdk import ForgeConn
f = ForgeConn(‘127.0.0.1:28210’)
rpc = f.rpc
vm = rpc.create_wallet(moniker=’vending_machine’, passphrase=’vm1234′)
addr = vm.wallet.address
rpc.get_account_balance(address)
•最后,发送交易。通过以下指令就可以发送我的合并交易啦。发送后会获得这次交易的 hash 值,通过 hash 值可以看看这次交易发送到链上是否成功。
itx =  protos.AggregateTx(sku=sku, value=value, time=time, operator=op.wallet.address, manufacturer=ma.wallet.address, supplier=su.wallet.address, location=lo.wallet.address)
itx2 = utils.encode_to_any(type_url=”fg:t:aggregate”, data=itx)
rpc.send_itx(tx=itx2, wallet=vm.wallet, token=vm.token, nonce=0)
rpc.is_tx_ok(‘[return-hash]’)

如何编写和部署一个交易协议 | ArcBlock 博客

以上就是要编写部署一个新的交易协议的步骤。如果没有问题,链上的任务就基本完成了。接下来,我们就可以专注做我们最熟悉的链下的设计。
在使用 Forge 开发框架部署了新的交易协议之后,我最大的感受是:用 Forge 开发框架真的很简单。它不仅帮我们解决了区块链底层复杂的技术,同时它也帮我们屏蔽掉了很多当我们只是想纯粹做个 DApp 时并不需要了解的知识和技术。通过提供模版化的步骤,Forge 开发框架大大降低了 DApp 开发的难度。在下一篇博客里,我将为大家展示我的 DApp 和介绍我是怎么完成我链下的部分。我也非常期待我的应用最后会是一个什么模样。另外,在目前这三周的学习和实践中,我也收获了很多心得,对区块链这个技术,以及它究竟可以通过怎样的方式来改变我们的生活有了更深的领悟。这也会在下一篇博客里和大家分享。那我们下次再见!