Skip to content

Commit dc1e902

Browse files
committed
feat(ddn-asset-*): improve DDN asset to make its development configuration simpler
1 parent c0e65ff commit dc1e902

17 files changed

Lines changed: 712 additions & 166 deletions

File tree

doc/asset.md

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
---
2+
title: DDN Blockchain Asset Plugin # 课程标题
3+
challengeType: 0 # 课程类型,默认为0:理论, 1: 实验
4+
order: 1 # 序号,以此为当前单元的课程排序
5+
time: 5个小时 # 学习时长
6+
videoUrl: '' # 视频链接地址
7+
prjectUrl: 'https://github.com/' # 源码地址
8+
localeTitle: DDN资产扩展 # 本地化标题
9+
---
10+
11+
# DDN资产扩展
12+
13+
## 资产类型
14+
15+
DDN资产,包括3种基本类型,第一种是简单的数字积分、代币等数字资产类型,我们定义为链上资产,即AoB,Asset on Blockchain, 这种资产与自身业务耦合较低,多用于业务积分等,只要直接申请即可,无需另行开发。
16+
17+
第二种是与自身业务耦合度较高,需要提供一些额外的数据字段用于存证,这类资产,我们可以通过扩展的方式定义成为DDN区块链的资产交易类型,我们称之为“资产扩展交易类”。
18+
19+
第三种是与自身业务耦合度高,不是简单地提供一些额外的数据字段就能解决的,我们建议开发Dapp应用,详见DAPP开发章节。
20+
21+
## 扩展方法
22+
23+
DDN资产基类AssetBase定义了一种资产接入区块链需要实现的方法和遵循的规范,所有自定义的扩展资产都必须继承自该基类。
24+
25+
但不必事先实现所有的方法,除了propsMapping方法必须实现以外,其他方法都可以直接使用基类的方法。请参考基类包含的方法。
26+
27+
### 1. 扩展规范
28+
29+
扩展包名称,必须使用`ddn-asset-`作为前缀开头,比如:`ddn-asset-dapp`.
30+
31+
扩展包文件,必须包含`.ddnrc.js`配置文件,用于设置该扩展里提供的交易配置;如果有新的数据表,还需要`define-models.js`文件用于定义模型;
32+
33+
### 2. 扩展方法
34+
35+
基类包括的方法如下:
36+
37+
```
38+
/**
39+
* transaction创建时调用,用来对输入参数根据资产进行个性化处理
40+
* @param {*} data 资产数据
41+
* @param {*} trs 交易对象
42+
*/
43+
async create(data, trs)
44+
45+
/**
46+
* 计算该类型资产交易的手续费(方法内不允许使用context对象内容)
47+
* @param {*} trs 交易对象
48+
* @param {*} sender 交易发起者
49+
*/
50+
async calculateFee(trs, sender)
51+
52+
/**
53+
* 定义资产属性和字段的对应关系
54+
* 基本属性最多支持定义15个属性
55+
* 字符串类型10个,名称分别是str1,str2,str3...str10,长度分别是32,64,64,128,128,256,256,512,512,1024,前4个有索引
56+
* 整数类型3个,名称分别是int1,int2,int3,类型为INT,前2个有索引
57+
* 时间戳类型2个,分别是timestamp1,timestamp2
58+
* 扩展属性理论上无上限,名称使用str_ext, int_ext, timestamp_ext,分别定义不同类型
59+
*
60+
* 以下属于系统属性,不可使用
61+
* amount:转账金额,默认为0,字符串类型
62+
* recipient_id:收款地址,默认为null
63+
* message:备注信息
64+
*/
65+
async propsMapping()
66+
67+
/**
68+
* 基于业务逻辑的输入数据校验
69+
* @param {*} trs 交易对象
70+
* @param {*} sender 交易发起者
71+
*/
72+
async verify(trs, sender)
73+
74+
/**
75+
* 交易加入未确认列表前的预处理方法
76+
* @param {*} trs 交易对象
77+
* @param {*} sender 交易发起者
78+
*/
79+
async process(trs, sender)
80+
81+
/**
82+
* 获取资产的字节格式数据,用于签名计算
83+
* @param {*} trs 交易对象
84+
*/
85+
async getBytes(trs)
86+
87+
/**
88+
* 应用未确认交易,锁定转账金额
89+
* @param {*} trs 交易对象
90+
* @param {*} sender 交易发起者
91+
* @param {*} dbTrans 数据库事务对象
92+
*/
93+
async applyUnconfirmed(trs, sender, dbTrans)
94+
95+
/**
96+
* 回滚未确认交易,解锁转账金额
97+
* @param {*} trs 交易对象
98+
* @param {*} sender 交易发起者
99+
* @param {*} dbTrans 数据库事务对象
100+
*/
101+
async undoUnconfirmed(trs, sender, dbTrans)
102+
103+
/**
104+
* 应用交易业务金额,进行转账操作
105+
* @param {*} trs 交易对象
106+
* @param {*} block 区块对象
107+
* @param {*} sender 交易发起者
108+
* @param {*} dbTrans 数据库事务对象
109+
*/
110+
async apply(trs, block, sender, dbTrans)
111+
112+
/**
113+
* 回滚交易业务金额,进行退回操作
114+
* @param {*} trs 交易对象
115+
* @param {*} block 区块对象
116+
* @param {*} sender 交易发起者
117+
* @param {*} dbTrans 数据库事务对象
118+
*/
119+
async undo(trs, block, sender, dbTrans)
120+
121+
/**
122+
* 校验交易传入数据是否符合规范,从数据格式、数据长度、是否必须角度进行
123+
* @param {*} trs 交易对象
124+
*/
125+
async objectNormalize(trs)
126+
127+
/**
128+
* 读取数据库数据并反序列成交易对象体
129+
* @param {*} raw 数据库查询返回对象
130+
*/
131+
async dbRead(raw)
132+
133+
/**
134+
* 将交易存储到数据库中
135+
* @param {*} trs 交易对象
136+
* @param {*} dbTrans 数据库事务对象
137+
*/
138+
async dbSave(trs, dbTrans)
139+
140+
/**
141+
* 确认交易当前状态是否可以打包进当前区块
142+
* @param {*} trs 交易对象
143+
* @param {*} sender 交易发起者
144+
*/
145+
async ready(trs, sender)
146+
147+
/**
148+
* 区块链启动成功后执行
149+
*/
150+
async onBlockchainReady()
151+
152+
/**
153+
* 自定义资产Api
154+
* @param {*} router Express路由对象
155+
*/
156+
async attachApi(router)
157+
```
158+
159+
### 3. 数据交互
160+
161+
由于扩展资产独立于区块链系统,为了和区块链系统进行交互,基类中提供了一些对象和方法,供用户使用。
162+
163+
```
164+
/**
165+
* 上下文属性,其中包含区块链中所有可操作对象,如区块对象、交易对象等等
166+
* context详细内容请查看相关文档
167+
*/
168+
this._context
169+
170+
/**
171+
* 获取资产所属包名
172+
*/
173+
async getPackageName()
174+
175+
/**
176+
* 获取资产配置名称
177+
*/
178+
async getTransactionName()
179+
180+
/**
181+
* 获取资产配置类型值
182+
*/
183+
async getTransactionType()
184+
185+
/**
186+
* 查询规定条件的资产数据
187+
* @param {*} where 查询条件,遵循sequelize规则,使用prop的名称定义
188+
* @param {*} orders 排序条件,遵循sequelize规则,使用prop的名称定义
189+
* @param {*} returnTotal 是否返回总条数,true/false
190+
* @param {*} pageIndex 查询的页码,从1开始
191+
* @param {*} pageSize 分页的大小,每页的返回的最大记录条数
192+
*/
193+
async queryAsset(where, orders, returnTotal, pageIndex, pageSize)
194+
195+
/**
196+
* 查询规定条件的资产数据的个数
197+
* @param {*} where 查询条件,遵循sequelize规则,使用prop的名称定义
198+
*/
199+
async queryAssetCount(where)
200+
201+
/**
202+
* 获取资产在交易对象中的名称
203+
* @param {*} type 资产在配置文件中的类型值
204+
*/
205+
async getAssetJsonName(type)
206+
207+
/**
208+
* 获得交易信息中的当前资产对象
209+
* @param {*} trs 交易对象
210+
*/
211+
async getAssetObject(trs)
212+
213+
/**
214+
* 根据资产配置名称获取资产对应实例
215+
* @param {*} assetName 资产类名,也即配置文件中的名称
216+
*/
217+
async getAssetInstanceByName(assetName)
218+
```
219+
220+
更多有关扩展资产的信息,请查看ddn-docs中的Extend Assets部分

examples/fun-tests/.ddnrc.js

Lines changed: 7 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -227,89 +227,16 @@ module.exports = {
227227
},
228228

229229
/**
230-
* 扩展插件,对于区块链而言就是资产包,所以使用 assets
231-
* TODO: 将交易类型直接扩展在插件内部,简化配置如下:
230+
* 扩展资产插件,对于区块链而言就是资产包,所以使用 assets
232231
* assets: [
233232
* "@ddn/ddn-evidence",
234233
* "@ddn/ddn-aob"
235234
* ]
236235
*/
237-
assets: {
238-
evidence: {
239-
transactions: [
240-
{
241-
name: "Evidence",
242-
type: 10
243-
}
244-
],
245-
package: "@ddn/ddn-evidence"
246-
},
247-
aob: {
248-
transactions: [
249-
{
250-
name: "AobIssuer",
251-
type: 60
252-
},
253-
{
254-
name: "AobAsset",
255-
type: 61
256-
},
257-
{
258-
name: "AobFlags",
259-
type: 62
260-
},
261-
{
262-
name: "AobAcl",
263-
type: 63
264-
},
265-
{
266-
name: "AobIssue",
267-
type: 64
268-
},
269-
{
270-
name: "AobTransfer",
271-
type: 65
272-
}
273-
],
274-
package: "@ddn/ddn-aob"
275-
},
276-
dapp: {
277-
transactions: [
278-
{
279-
name: "Dapp",
280-
type: 11
281-
},
282-
{
283-
name: "InTransfer",
284-
type: 12
285-
},
286-
{
287-
name: "OutTransfer",
288-
type: 13
289-
}
290-
],
291-
package: "@ddn/ddn-dapp"
292-
},
293-
dao: {
294-
transactions: [
295-
{
296-
name: "Org",
297-
type: 40
298-
},
299-
{
300-
name: "Exchange",
301-
type: 41
302-
},
303-
{
304-
name: "Contribution",
305-
type: 42
306-
},
307-
{
308-
name: "Confirmation",
309-
type: 43
310-
}
311-
],
312-
package: "@ddn/ddn-dao"
313-
}
314-
}
236+
assets: [
237+
"@ddn/ddn-evidence",
238+
"@ddn/ddn-aob",
239+
"@ddn/ddn-dapp",
240+
"@ddn/ddn-dao"
241+
],
315242
};

0 commit comments

Comments
 (0)