Bytom DAPP 开发流程
从目前已经发布的DAPP
来看,DAPP
架构大致可以分成3种类型:插件钱包模式、全节点钱包模式和兼容模式。
- 插件钱包模式是借助封装了钱包的浏览器插件通过
RPC
协议与区块链节点通信,插件在运行时会将Web3
框架注入到DAPP
前端页面中,然后DApp
通过Web3
来与区块链节点通信。 - 全节点钱包模式需要项目方同步并持有一个区块链节点,并对外提供一个浏览器环境与用户进行交互。
- 兼容模式可以在插件钱包和全节点钱包下同时使用,即上述两种方式可以自由切换,安全性能相对较高。
接下来介绍的比原链DAPP
的架构模式跟账户模型DAPP
的插件钱包模式有些相似,都是由DAPP
前端、插件钱包和合约程序共同组成,其中插件钱包需要连接去中心化的区块链服务器blockcenter
,该服务器主要是为了管理插件钱包的相关信息。此外,比原链是UTXO
模型的区块链系统,合约程序存在于无状态的UTXO
中,如果要实现这样一个具体的DAPP
,就需要在前端和后端多做一些逻辑的处理。
1. 编写、编译并实例化智能合约
编写智能合约
比原链的虚拟机是图灵完备的,理论上可以实现任意图灵计算机能实现的操作。而Equity
作为比原链的智能合约语言,使用Equity
语言可以实现许多典型的金融模型案例,但是为了解决停机问题,比原链也设置了手续费的上限,因此用户在设计合约的时候做一下权衡。
合约模板结构如下:
contract contract_name(...) locks valueAmount of valueAsset {
clause clause_name(...) {
...
lock/unlock ...
}
...
}
Equity
语法结构简单,语句意思明确,有开发经验的童鞋一看基本能明白合约的意思。编写智能合约可以参考Equity
合约介绍,文档中对Equity
语言的语法和编译方法都做了详细的介绍。此外,文档还对一些典型的模板合约进行了介绍,开发者可以自己需求进行参考。
编译并实例化合约
编译合约目前支持两种方式,一种是使用Equity
编译工具,另一种是调用比原链中编译合约的RPC
接口compile
; 而合约实例化是为了将合约脚本按照用户设定的参数进行锁定,编译并实例化合约可以参考编译并实例化合约的上半部分说明,该文档不仅介绍了合约的参数构造说明,还对编译合约的步骤进行详细说明。而编译器以及相关工具位于Equity
编译器中,是使用go
语言开发的,用户可以下载源代码并编译使用。
工具编译和实例化示例如下:
// compile
./equity [contract_name] --bin
// instance
./equity [contract_name] --instance [arguments ...]
2. 部署合约
部署合约即发送合约交易,调用比原链的build-transaction
接口将指定数量的资产发送到合约program
中,只需将输出output
中接收方control_program
设置为指定合约即可。用户可以参考合约交易说明中的锁定合约章节,交易的构造按照文档中介绍进行参考即可。如果合约交易发送成功,并且交易已经成功上链,便可以通过调用API
接口list-unspent-outputs
来查找该合约的UTXO
。
部署合约交易模板大致如下:
{
"actions": [
// inputs
{
// btm fee
},
{
amount, asset, spend_account
// spend user asset
},
// outputs
{
amount, asset, contract_program
// receive contract program with instantiated result
}
],
...
}
3. 搭建DAPP架构
Bytom的blockcenter
服务器是官方开发的去中心化插件钱包服务器,开发者可以按照相关API
接口来调用即可。比原链的DAPP
总体框架模型如下:
DAPP前端
搭建DAPP
前端主要包含两个方面:一个是前端与插件钱包的交互,另一个是前端的逻辑处理、以及与缓冲服务器的交互。插件钱包是与区块链节点服务器通信的窗口,一个DAPP
为了跟区块链节点进行通信,需要通过借助插件来与后台服务器节点进行交互。比原的插件钱包除了与后台服务器进行交互之外,还包含一些本地业务逻辑处理的接口API
,具体内容可以参考一下DAPP开发者向导。由于比原链是基于UTXO
模型的区块链系统,交易是由多输入和多输出构成的结构,并且交易输入或输出的位置也需要按照顺序来排列,因此开发DAPP
需要前端处理一些构建交易的逻辑。除此之外,合约中的lock-unlock
语句中涉及到数量的计算需要根据抽象语法树来进行预计算,计算的结果将用于构建交易,而verify
、if-else
等其他语句类型也需要进行相关的预校验,从而防止用户在执行合约的时候报错。
从功能层面来说,前端主要包含页面的设计、插件的调用、合约交易逻辑的处理、缓冲服务器的交互等。接下来对这几个重要的部分展开说明:
1)前端页面的设计主要是网页界面的设计,这个部分开发者可以自己选择页面模式
2)插件钱包已经进行了结构化的封装,并且提供了外部接口给
DAPP
开发者调用,开发者只需要将插件的参数按照规则进行填充,具体请参考DAPP开发者向导3)比原链的合约交易是多输入多输出的交易结构,前端需要进行一些预判断逻辑的处理,然后再选择合适的合约交易模板结构。
4)DAPP的插件连接的是去中心化的
bycoin
服务器,该服务器从比原节点服务器上同步的所有区块信息和交易信息,该部分主要是在插件钱包层进行了高度的封装,用户只需按照接口调用即可。除此之外,需要开发者搭建一个缓冲服务器,不仅可以在管理合约UTXO
层面做一些性能方面的处理,而且还可以为DAPP
做一些数据存储。开发者可以根据实际需求来开发一些RPC
请求接口,然后在前端页面设置相关条件来触发这些API
的调用。
前端逻辑处理流程大致如下:
调用插件,比原的
chrome
插件源码位于Bytom-JS-SDK,开发比原DAPP
时调用插件的说明可以参考Dapp Developer Guide,其网络配置如下:window.addEventListener('load', async function() { if (typeof window.bytom !== 'undefined') {
let networks = {
solonet: ... // solonet bycoin url
testnet: ... // testnet bycoin url
mainnet: ... // mainnet bycoin url
}; ... startApp();
});
配置合约参数,可以采用文件配置的方式,该步骤是为了让前端得到需要用到的一些已经固定化的合约参数,其前端配置文件为
configure.json.js
,其示例模型如下:var config = {
"solonet": {
... // contract arguments
"gas": 0.4 // btm fee
},
"testnet":{
...
},
"mainnet":{
...
}
}
前端预计算处理,如果合约中包含
lock-unlock
语句,并且Amount
是一个数值表达式,那么前端来提取计算表达式并进行相应的预计算。此外,前端还需要预判下所有可验证的verify
语句,从而判定交易是否可行,因为一旦前端对这些验证失败,合约将必然验证失败。此外,如果define
或assign
语句涉及的变量,前端也需预计算这些变量的值。构建合约交易模板,由于解锁合约是解锁
lock
语句条件,构造交易需要根据lock
语句或unlock
语句来进行变换。解锁合约交易是由inputs
和outputs
构成,交易的第一个input
输入一般都是是固定的,即合约UTXO
的hash
值,除此之外,其他输入输出都需要根据DAPP中的实际合约来进行变更,其模型大致如下:const input = []
input.push(spendUTXOAction(utxohash))
... // other input const output = []
output.push(controlProgramAction(amount, asset, program))
... // other output
启动前端服务
编译前端命令如下:
npm run build
启动之前需要先启动
bufferserver
缓冲服务器,然后再启动前端服务,其前端启动命令如下:npm start
DAPP缓冲服务器
缓冲服务器主要是为了在管理合约UTXO
层面做一些效率方面的处理,包括了对bycoin
服务器是如何同步请求的,此外对DAPP
的相关交易记录也进行了存储。bycoin
服务器是比原链的去中心化钱包服务器,缓冲服务器的UTXO
跟它是同步更新的,比原官方插件钱包默认连接的就是该服务器。尽管bycoin
服务器的也对比原链的所有UTXO
进行了管理,但是由于UTXO
数量比较大,如果直接在该层面处理会导致DAPP
性能不佳,所以建议用户自己构建自己的缓冲服务器做进一步优化处理。此外,DAPP
开发者也可以搭建了自己的去中心化钱包服务器,并且自己开发相关的插件。
缓冲服务器架构可以参考一下bufferserver案例的源代码,其编译和启动步骤如下:
编译
bufferserver
源代码按照
README
安装部署服务需要的软件包Mysql
和Redis
,然后下载源代码并编译:make all
编译完成之后,在
target
目录下会生成可执行文件api
和updater
。启动服务
使用
root
用户创建数据库和数据表,其命令如下:mysql -u root -p < database/dump.sql
修改配置文件
config_local.json
,配置说明参考README
的config
配置参数详解。启动
api
和updater
服务器,其中api
是提供JSON RPC
请求的服务进程,updater
是提供同步blockcenter
和区块链浏览器数据请求的服务进程。./target/api config_local.json ./target/updater config_local.json
启动缓冲服务器之后,便可以启动前端服务,然后打开
DAPP
的网页URL
即可使用。附:缓冲服务器的
JSON RPC
接口可以参考wiki
接口说明。
Bytom DAPP实例
Bytom DAPP
实例说明,请参考储蓄分红DAPP
Bytom DAPP 开发流程的更多相关文章
- Bytom Dapp 开发笔记(二):开发流程
简介 这章的内容详细分析一下涉及智能合约Dapp的整个开发流程,注意是涉及只能合约,如果你只要一些基本转BTM功能没有太大意义,本内容补充一下官方提供的 比原链DAPP开发流程,详细实践过好踩到的一些 ...
- Bytom Dapp 开发笔记(一):架构设计
简介 研究比原链已经一年了,用比原链做了几个dapp,而且最近还做了一个基于他们插件钱包的dapp,总结了一些遇到的坑,还有一些技术细节,接下来我会分成三章,从dapp设计架构上,到深入到源码分析去帮 ...
- Bytom Dapp 开发笔记(三):Dapp Demo前端源码分析
本章内容会针对比原官方提供的dapp-demo,分析里面的前端源码,分析清楚整个demo的流程,然后针对里面开发过程遇到的坑,添加一下个人的见解还有解决的方案. 储蓄分红合约简述 为了方便理解,这里简 ...
- 合约实战,代币合约,DAPP开发
1. ERC20标准 https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md pragma solidity ^; //定义接口 con ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记5——区块链福利彩票的设计
笔者一直强调,一定要利用区块链的特点来解决行业存在的问题,并且该问题最好用区块链解决或者说只能用区块链解决.彩票行业就是个例子. 在讲解代码之前,首先讲解一下业务设计,如图6.15所示. 图6.15 ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记1——天外飞仙DAPP
Solidity编程语言解决了编写智能合约的不友好的问题,但是当合约编译并部署之后,对与这些接口的访问,对于一般的使用者来说,门槛有点高, 对普通用户来说也是非常不友好,为了使广大用户理解并方便快捷的 ...
- DAPP开发初探——永存的留言
转载地址 https://blog.csdn.net/qq_33764491/article/details/80570266 前言 最近DAPP的开发貌似很火,学习了区块链的一些知识之后,相信有很多 ...
- Linux下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
- 小谈Scrum敏捷开发流程
一晃眼,有两年没有写博客了,回顾前两年,各种奔波,各种忙碌,也有不少的收获.从今天开始,我要把这些收获都分享在这里. 其实这两年,对我影响最大的是开发流程.总所周知,一个好的开发流程,对于项目的进行, ...
随机推荐
- Python之爬虫(二十四) 爬虫与反爬虫大战
爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到数据,谁是最后的赢家? 重新理解爬虫中的一些概念 爬虫:自动获取网站数据的程序反爬虫:使用技术手段防止爬虫程序爬取数据误伤:反爬虫技术将普通用 ...
- JVM垃圾回收(五)
低延迟垃圾收集器 衡量垃圾收集器的三项最重要的指标是: 内存占用(Footprint).吞吐量(Throughput)和延迟(Latency).三者总体的表现会随技术进步而越来越好,但是要在这三个方面 ...
- Java8之Stream 集合聚合操作集锦(含日常练习Demo)
Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找.遍历.过滤以及常 ...
- 从零开始学Electron笔记(六)
在之前的文章我们介绍了一下Electron如何通过链接打开浏览器和嵌入网页,接下来我们继续说一下Electron中的对话框 Dialog和消息通知 Notification. 在之前的文章中其实我们是 ...
- Python Ethical Hacking - TROJANS Analysis(4)
Adding Icons to Generated Executables Prepare a proper icon file. https://www.iconfinder.com/ Conver ...
- 一次HTTP请求服务的完整过程-请求处理过程
0.DNS域名解析:递归查询.迭代查询 递归查询:客户端向第一个服务器查询,给最终结果 迭代查询:第一个服务器向根查询 1 .建立连接:接收或拒绝连接请求:三次握手的过程 提高HTTP 连接性能: 并 ...
- socket解决半包、粘包问题
最近项目遇到socket服务端接收报文不全的问题,与其客户端约定的是报文长度+报文体.然而当客户端数据量大的时候,用分包发送,导致服务端报文日志接收不完整,于是想着先读出包体长度,再读出包体,不够就一 ...
- python-多任务编程05-协程(coroutine)
协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为它自带CPU上下文.这样只要在合适的时机, 我们可以把一个协程 切换 ...
- 使用iOS网络请求
https://github.com/yuantiku/YTKNetwork/blob/master/Docs/2.0_MigrationGuide_cn.md
- 把若依管理系统部署到Linux
一.前言 1.非常感谢若依作者为大家提供的非常优质的开源web项目,非常感谢!!! 2.若依官方文档:http://doc.ruoyi.vip/ruoyi/ 3.若依官方链接: 1)若依管理系统官方体 ...