DCore API接口说明
本篇文档会向DCore的开发者或集成者介绍DCore的应用程序接口(API)。
访问以下链接,您可以浏览所有的API接口。
API接口架构
根据API接口来源,主要划分为两种。
- Daemon API - 调用此接口需连接到运行中的Daemon(守护者进程)(decentd)。
- Wallet API - 钱包API接口 – 调用此接口需连接到运行中的CLI命令行钱包。
守护者进程API接口分为以下接口组件:
- 登录 - 包含login和enable_api组件。这是唯一不需要提前调用enable_api就可以使用的API接口组件(连同database API一起)。其他所有的接口组件都需要通过提前调用enable_api,才能够调用并获取接口id。id的作用是调用特殊组件中所有的API接口。接下来的API调用事例中会详细解释该操作。
- 数据库 - 包含可从全节点数据库接收信息的API接口,例如交易目标、交易、区块、账户、财产等信息。
- 交易历史 - 包含提供交易历史的API接口。
- 网络广播 - 包括广播至全网的API接口。
- 网络节点 - 包含获取或变更点对点网络设置的API接口。
- 加密 - 包含签名和进行验证的API接口。
- 消息传送 - 包含发送和接收消息的API接口。
钱包API接口不包含API接口组件。
通讯协议
用于API接口调用的通讯协议是HTTP和Websocket。两者的主要差异是HTTP协议不会保持会话状态,所以我们只能调用守护者进程 (Daemon API)内的数据库 (database)API接口组件中的一个。钱包API组件 (Wallet API)既可以通过Websocket调用,也可以通过HTTP调用,因为运行中的CLI钱包程序可以为每一次连接保留会话数据。
我们首先会展示一些使用Websocket协议的实例,之后会展示使用HTTP协议的实例。
使用Websocket协议的先决条件
以下指南为API接口组件的测试环境提供了简易的安装程序。
为了通过Websocket协议调用daemon或钱包API接口,您需要:
• 运行decentd (decentd也被称为daemon)
• 运行适合Websocket协议连接的CLI钱包(仅限钱包API接口)
• 安装wscat应用程序
该测试环境在Linux,MacOS和Windows操作系统上均可安装。关于如何运行decentd和CLI钱包的说明请访问: https://docs.decent.ch/API/#calling_dcore_daemon_api_via_websocket
安装wscat:
npm install -g wscat
提示
如果尚未安装NPM,您可以从Node.js webpage下载
通过Websocket 调用 DCore守护者进程API接口
运行守护者进程API接口的测试环境
执行decentd开启DCore守护者进程
./decentd
连接Websocket协议至DCore daemon:
wscat -c ws://127.0.0.1:8090
登录API接口
为从任意应用API组件中成功调用所有API接口,请首先调用登录API接口(可在登录组件当中找到),此接口会默认被激活。
注意
• 不是所有的API接口组件都能够在每个实例中激活(为安全起见,网络节点(network_node)只能在daemon中被激活,并可以配置连接到API接口组件)。
• 其他在上面表单当中提到的API接口组件可以进行任意连接。
API组件调用JSON架构
-
id - call_id(API接口调用的识别码,可对需求进行匹配)
-
method - call - 调用API接口的命令
-
params- [ apiset_id,api_name,[ list_of_params]]
-
第一个参数 apiset_id为API接口组件的账户
-
第二个参数 api_name为需要调用的API接口的名称
-
第三个参数[ list_of_params]是特殊API接口的参数列表,任意参数也可以成为一个独立数值列表,如此一来,列表就被嵌套在括号当中。
调用 - login api:
{"id":1,"method":"call","params":[1,"login",["",""]]}
回应:
{"id":1,"result":true}
说明
通过把 apiset_id 设为1调用 login API 组件 。这个数值被定义为默认值,并且为恒定值。
激活特殊API接口组件
若要激活特殊API接口组件需要调用enable_api。此API接口来自登录API接口组件,并且此接口默认为可获得。
调用 - 激活数据库API接口组件:
{"id":1,"method":"call","params":[1,"database",[]]}
回应:
{"id":1,"result":2}
若可连接API接口组件,组件的成员名称,也就是id,会以名称结果的数值返回(之前的事例当中,名称结果的数值为2)。目前,此id适用于任意数据库API接口的所有调用(作为apiset_id,params中的第一个参数)。请注意,此id可以区分于所有的连接(取决于激活API接口组件的命令)。
通知
还有另外一种可能,能够在不需要调用登录API接口就能够直达数据库API接口组件。为此,可以使用 call login example 的调用框架并且作出以下变更:
• apiset_id数值更换为0
• apiset_name的数值更换为database
激活API接口组件调用API接口
我们假设,选中的API接口是获取账户余额(get_account_balances)的接口,我们想要通过id=1.2.21的账户看到其中的余额。由于此API接口属于数据库API接口组件,我们已经有了接口组件,也就是id = 2,所以正确的调用方式为:
调用 - (get_account_balances) api:
{"id":1,"method":"call","params":[2,"get_account_balances",["1.2.21",[]]]}
回应:
{"id":1,"result":[{"amount":"15400490000","asset_id":"1.3.0"}]}
另外一个通过组件调用API的例子为:从交易历史API接口组件中的获取账户历史(get_account_history)。
调用 - 激活交易历史API接口组件:
{"id":1,"method":"call","params":[1,"history",[]]}
回应:
{"id":1,"result":3}
请注意:
所有API接口组件的激活只需调用一次
成员名称结果的返回数值被用于获取账户历史(get_account_history)调用的API接口组件id。例如,我们通过调用id = 1.2.21查看账户的最后两笔历史记录。
调用 - 获取账户历史(get_account_history)api:
{"id":1,"method":"call","params":[3,"get_account_history",["1.2.21","1.7.1",2,"1.7.1212121"]]}
回应(历史记录表单):
{
"id": 1,
"result": [
{
"id": "1.7.38270",
"op": [
1,
{
"fee": {
"amount": 500000,
"asset_id": "1.3.0"
},
"registrar": "1.2.21",
"name": "myaccount",
"owner": {
"weight_threshold": 1,
"account_auths": [
],
"key_auths": [
[
"DCT66RkRV5vpanRc7iAXdFyAMwFTbmLHCUe9eBB6aQjaHkrTZfBHL",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [
],
"key_auths": [
[
"DCT66RkRV5vpanRc7iAXdFyAMwFTbmLHCUe9eBB6aQjaHkrTZfBHL",
1
]
]
},
"options": {
"memo_key": "DCT66RkRV5vpanRc7iAXdFyAMwFTbmLHCUe9eBB6aQjaHkrTZfBHL",
"voting_account": "1.2.3",
"num_miner": 0,
"votes": [
],
"extensions": [
],
"allow_subscription": false,
"price_per_subscribe": {
"amount": 0,
"asset_id": "1.3.0"
},
"subscription_period": 0
},
"extensions": {
}
}
],
"result": [
1,
"1.2.4143"
],
"block_num": 702030,
"trx_in_block": 0,
"op_in_trx": 0,
"virtual_op": 37303
},
{
"id": "1.7.37253",
"op": [
1,
{
"fee": {
"amount": 500000,
"asset_id": "1.3.0"
},
"registrar": "1.2.21",
"name": "myaccount",
"owner": {
"weight_threshold": 1,
"account_auths": [
],
"key_auths": [
[
"DCT66RkRV5vpanRc7iAXdFyAMwFTbmLHCUe9eBB6aQjaHkrTZfBHL",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [
],
"key_auths": [
[
"DCT66RkRV5vpanRc7iAXdFyAMwFTbmLHCUe9eBB6aQjaHkrTZfBHL",
1
]
]
},
"options": {
"memo_key": "DCT66RkRV5vpanRc7iAXdFyAMwFTbmLHCUe9eBB6aQjaHkrTZfBHL",
"voting_account": "1.2.3",
"num_miner": 0,
"votes": [
],
"extensions": [
],
"allow_subscription": false,
"price_per_subscribe": {
"amount": 0,
"asset_id": "1.3.0"
},
"subscription_period": 0
},
"extensions": {
}
}
],
"result": [
1,
"1.2.4142"
],
"block_num": 701189,
"trx_in_block": 0,
"op_in_trx": 0,
"virtual_op": 37286
}
]
}
获取账户历史API接口的开发者文档(https://docs.decent.ch/developer/group___history_a_p_i.html#ga2bfce814ce4adde1c30e63662f3fa18c
通过Websocket调用钱包API接口
为钱包运行测试环境
执行decentd开启DCore daemon
./decentd
在默认端口运行适用于Websocket连接的CLI钱包
cli_wallet -r
wscat -c ws://127.0.0.1:8091
将Websocket协议连接至CLI钱包
wscat -c ws://127.0.0.1:8091
调用钱包API接口
根据特殊API接口详细说明,通过设置数值 - method和 params调用应用程序接口。请注意,params数值是括号当中params的列表数值。 id数值可以为任意值,用于匹配调用及其返回的数值。
调用格式:
{
"jsonrpc": "2.0",
"id": "call_id",
"method": "api_name",
"params": ["param_1", "param_2", "...", "param_N"]
}
这其中的参数为:
• id - 任意识别API接口调用的数字都会出现在JSON回应中。
• - method - 被调用API接口的全名。
• params - 是特殊API接口的参数列表,任意参数也可以成为一个独立数值列表,这样,列表就被嵌套在括号当中。
举例说明, unlock API接口在文档中被定义为:
public void unlock(string password)
因此,Websocket 调用定义为:
调用 - unlock api:
{"jsonrpc":"2.0","id":1,"method":"unlock","params":["myUnlockPwd"]}
回应:
{"id":1,"result":null}
另一个实例为获取账户(get_account)
调用 - (get_account) api:
{"jsonrpc":"2.0","id":1,"method":"get_account","params":["1.2.21"]}
回应:
{
"id": 1,
"result": {
"id": "1.2.21",
"registrar": "1.2.20",
"name": "decent-go",
"owner": {
"weight_threshold": 1,
"account_auths": [
],
"key_auths": [
[
"DCT8gwQkHXNYgHp1kzo56oZCLdrm3qV99xN15yeE1QhBcbAYsMDZy",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [
],
"key_auths": [
[
"DCT8gwQkHXNYgHp1kzo56oZCLdrm3qV99xN15yeE1QhBcbAYsMDZy",
1
]
]
},
"options": {
"memo_key": "DCT8gwQkHXNYgHp1kzo56oZCLdrm3qV99xN15yeE1QhBcbAYsMDZy",
"voting_account": "1.2.3",
"num_miner": 0,
"votes": [
],
"extensions": [
],
"allow_subscription": false,
"price_per_subscribe": {
"amount": 0,
"asset_id": "1.3.0"
},
"subscription_period": 0
},
"rights_to_publish": {
"is_publishing_manager": false,
"publishing_rights_received": [
],
"publishing_rights_forwarded": [
]
},
"statistics": "2.5.21",
"top_n_control_flags": 0
}
}
通过HTTP调用DCore守护者进程API接口
运行DCore守护者进程
通过执行decentd开启DCore守护者进程
./decentd
调用数据库应用程序接口
若通过Websocket协议调用,所有应用程序接口调用都有相同的数据结构。
数据库应用程序接口的开发者文档
举例说明,我们会用一个账户 id参数 1.2.69来调用获取账户 (get_accounts)应用程序接口。
HTTP需求 - 获取账户(get_accounts)api:
curl --data '{"jsonrpc":"2.0","id":1,"method":"get_accounts","params":[["1.2.69"]]}' http://127.0.0.1:8090/rpc
回应:
{
"id": 1,
"result": [
{
"id": "1.2.69",
"registrar": "1.2.15",
"name": "ronald",
"owner": {
"weight_threshold": 1,
"account_auths": [
],
"key_auths": [
[
"DCT8SFcioQFYXnNHNSAEcLb5o5EovrhjPk4SMbYnag6t6VhwuvMAc",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [
],
"key_auths": [
[
"DCT8SFcioQFYXnNHNSAEcLb5o5EovrhjPk4SMbYnag6t6VhwuvMAc",
1
]
]
},
"options": {
"memo_key": "DCT8SFcioQFYXnNHNSAEcLb5o5EovrhjPk4SMbYnag6t6VhwuvMAc",
"voting_account": "1.2.3",
"num_miner": 0,
"votes": [
"0:1",
"0:11"
],
"extensions": [
],
"allow_subscription": true,
"price_per_subscribe": {
"amount": 100000000,
"asset_id": "1.3.0"
},
"subscription_period": 7
},
"rights_to_publish": {
"is_publishing_manager": false,
"publishing_rights_received": [
],
"publishing_rights_forwarded": [
]
},
"statistics": "2.5.69",
"top_n_control_flags": 0
}
]
}
通过HTTP调用钱包API接口
运行DCore Daemon和钱包
通过执行decentd开启DCore daemon:
./decentd
在默认端口运行适用于Websocket连接的CLI钱包:
cli_wallet -H
钱包API接口调用实例
钱包API接口调用的数据结构不论通过HTTP协议还是通过Websocket协议都是一样的。
以下为调用 unlock API接口的实例
钱包命令:
locked >>> unlock myPassword
HTTP需求 - unlock api:
curl --data '{"jsonrpc":"2.0","id":1,"method":"unlock","params":["myPassword"]}' http://127.0.0.1:8093/rpc
回复
{
"id": 1,
"result": null
}
一旦钱包解锁,我们就能够调用,比如一个简单的DCT交易。
钱包命令:
transfer fromAccount toAccount 1 DCT "note" true
HTTP 需求- transfer api:
curl --data '{"jsonrpc":"2.0","id":1,"method":"transfer","params":["fromAccount" "mictoAccountkey" "1" "DCT" "nate" "true"]}' http://127.0.0.1:8093/rpc
回应:
{
"id": 1,
"result": {
"ref_block_num": 43971,
"ref_block_prefix": 4115917218,
"expiration": "2018-01-16T09:53:15",
"operations": [
[
0,
{
"fee": {
"amount": 500000,
"asset_id": "1.3.0"
},
"from": "1.2.69",
"to": "1.2.73",
"amount": {
"amount": 100000000,
"asset_id": "1.3.0"
},
"memo": {
"from": "DCT8SFcioQFYXnNHNSAEcLb5o5EovrhjPk4SMbYnag6t6VhwuvMAc",
"to": "DCT5yt9cuR2d6UDmtQQZBckT4eNJ3u9fmmWnBfiBEgqz1PnQyzHqD",
"nonce": "3964683768455640627",
"message": "5ccbbb3b98a916ef7bc60c8aff06198a"
},
"extensions": [
]
}
]
],
"extensions": [
],
"signatures": [
"1f7e2844d458182ac9490accdda00e61c47ac416bda9502c758dae0cbb3b3603ff70d32c019c5a23bef8944be8ad7c7d2a5f8080f41159a5c483593c51973ad535"
]
}
}