BIF-OFFLINE-API
离线API主要是账户和密码学相关API, 不需要连接星火链网RPC接口也能工作。具体操作、接口如下:
1.部署服务
1.1 获取镜像
docker pull caictdevelop/bif-offline-api:v1.0.0
1.2 启动服务
docker run -d -p 8888:8888 --name bif-offline-api --restart always caictdevelop/bif-offline-api:v1.0.0
1.3 查询服务
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7fab57f360a2 caictdevelop/bif-offline-api:v1.0.0 "./app" 31 seconds ago Up 29 seconds 0.0.0.0:8888->8888/tcp bif-offline-api
2.接口服务
2.1 本地账号生成
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
keyType |
int |
必填 |
加密类型,1:ed25519 , 2:sm2 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.encAddress |
string |
账号地址 |
data.encPublicKey |
string |
星火公钥 |
data.encPrivateKey |
string |
星火私钥 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/createAddress
{
"keyType":1
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"encAddress": "did:bid:efNs6DGRwnaWvdBqp6PVLFJQzL5rxYeF",
"encPrivateKey": "priSPKnS7DVESZGYbjc6tqYfzN4R74E6DXzgzD5RMt5VDj2ftA",
"encPublicKey": "b065664e71b940a91737a9136df9081b03262c43e94ba517820fe14cb9fad79d6395fc"
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "type值必须是1或者2"
}
2.2 根据私钥获取账号
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
privateKey |
string |
必填 |
星火私钥 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.encAddress |
string |
账号地址 |
data.encPublicKey |
string |
星火公钥 |
data.encPrivateKey |
string |
星火私钥 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/getAddressByPrivateKey
{
"privateKey":"priSPKi7K3nVAgtdCu9k9hVn4modxzFkd73JGsRrUYJR1T2RxM"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"encAddress": "did:bid:efQ69GRtQUDR9SngdFKAv4owYyx5Fnko",
"encPrivateKey": "priSPKi7K3nVAgtdCu9k9hVn4modxzFkd73JGsRrUYJR1T2RxM",
"encPublicKey": "b06566d8fb4a6dfbe0d5831e38f621391ad9191626f7e28c13d3a0482c52d5c9607b14"
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "private key (***) is invalid"
}
2.3 根据公钥获取账号
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
publicKey |
string |
必填 |
星火公钥 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.encAddress |
string |
账号地址 |
data.encPublicKey |
string |
星火公钥 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/getAddressByPublicKey
{
"publicKey": "b06566d8fb4a6dfbe0d5831e38f621391ad9191626f7e28c13d3a0482c52d5c9607b14"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"encAddress": "did:bid:efQ69GRtQUDR9SngdFKAv4owYyx5Fnko",
"encPublicKey": "b06566d8fb4a6dfbe0d5831e38f621391ad9191626f7e28c13d3a0482c52d5c9607b14"
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "public key (***) is invalid, please check"
}
2.4 星火私钥转原生私钥
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
encPrivateKey |
string |
必填 |
星火私钥 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.keyType |
int |
加密类型,1:ed25519 , 2:sm2 |
data.rawPrivateKey |
string |
原生私钥 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/getRawPrivateKey
{
"encPrivateKey": "priSrrgL1JPpgKBCdjoyf8E4dRfaF2NYTKmqnSWKfTfhj8ngLc"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"keyType": 2,
"rawPrivateKey": "270e2630f429cd5b8ddd76c605245a2814f08255f27e9810418801b5a0b804a5"
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "private key (****) is invalid"
}
2.5 星火公钥转原生公钥
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
encPublicKey |
string |
必填 |
星火公钥 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.rawPublicKey |
string |
原生公钥 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/getRawPublicKey
{
"encPublicKey": "b06566424ea71b348ebad4eecac7497227607f2cc3bc128d6248e742faf30ec149e2ed"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"rawPublicKey": "424ea71b348ebad4eecac7497227607f2cc3bc128d6248e742faf30ec149e2ed"
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "endPublicKey 无效"
}
2.6 根据星火公钥获取加密方式
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
encPublicKey |
string |
必填 |
星火公钥 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.keyType |
string |
加密类型,ed25519 / sm2 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/getEncryptionTypeByPubK
{
"encPublicKey": "b06566424ea71b348ebad4eecac7497227607f2cc3bc128d6248e742faf30ec149e2ed"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"keyType": "SM2"
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "endPublicKey 无效"
}
2.7 原生私钥转星火私钥
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
keyType |
int |
必填 |
加密类型,1:ed25519 , 2:sm2 |
rawPrivateKey |
string |
必填 |
原生私钥 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.keyType |
int |
加密类型,1:ed25519 , 2:sm2 |
data.encPrivateKey |
string |
星火私钥 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/getEncPrivateKeyByRaw
{
"keyType":2,
"rawPrivateKey": "270e2630f429cd5b8ddd76c605245a2814f08255f27e9810418801b5a0b804a5"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"encPrivateKey": "priSrrgL1JPpgKBCdjoyf8E4dRfaF2NYTKmqnSWKfTfhj8ngLc",
"keyType": 2
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "type值必须是1或者2"
}
2.8 原生公钥转星火公钥
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
keyType |
int |
必填 |
加密类型,1:ed25519 , 2:sm2 |
rawPublicKey |
string |
必填 |
原生公钥 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.keyType |
int |
加密类型,1:ed25519 , 2:sm2 |
data.encPublicKey |
string |
星火公钥 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/getEncPublicKeyByRaw
{
"keyType":1,
"rawPublicKey": "424ea71b348ebad4eecac7497227607f2cc3bc128d6248e742faf30ec149e2ed"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"encPublicKey": "b06566424ea71b348ebad4eecac7497227607f2cc3bc128d6248e742faf30ec149e2ed",
"keyType": 1
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "endPublicKey 无效"
}
2.9 构造合约签名交易
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
senderAddress |
string |
必填 |
交易源账号,即交易的发起方 |
senderPrivateKey |
string |
必填 |
交易源账户私钥 |
contractAddress |
string |
必填 |
合约账户地址 |
input |
string |
必填 |
待触发的合约的main()入参 |
nonce |
Long |
必填 |
账户交易序列号 |
feeLimit |
Long |
选填 |
交易花费的手续费(单位是PT),默认1000000L |
bifAmount |
Long |
选填 |
转账金额,大小限制[0, Long.MAX_VALUE] |
GasPrice |
Long |
选填 |
打包费用 (单位是PT),默认100L |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.serialization |
string |
交易序列化信息 |
data.publicKey |
string |
交易源账户公钥 |
data.signData |
string |
签名数据 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/contract
{
"senderAddress": "did:bid:efQ69GRtQUDR9SngdFKAv4owYyx5Fnko",
"senderPrivateKey":"priSPKi7K3nVAgtdCu9k9hVn4modxzFkd73JGsRrUYJR1T2RxM",
"contractAddress":"did:bid:efAHUyTyhCdUXSxb3znw3Jw4ET24GdCk",
"bifAmount":0,
"feeLimit":100000000,
"gasPrice":10,
"nonce":33,
"input":" {\"function\":\"safeTransferFrom(address,address,string)\",\"args\":\"did:bid:efQ69GRtQUDR9SngdFKAv4owYyx5Fnko,did:bid:ef1L8GBs9mWzeKXGiAZC877WResz6y7,'did:bid:efDtTjWBLkJjtRSJFMfBLNJ6LjnKu1tV'\"}"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"serialization": "0a286469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f102122ee01080752e9010a286469643a6269643a65664148557954796843645558537862337a6e77334a7734455432344764436b1abc017b2266756e6374696f6e223a22736166655472616e7366657246726f6d28616464726573732c616464726573732c737472696e6729222c2261726773223a226469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f2c6469643a6269643a6566314c38474273396d577a654b584769415a43383737575265737a3679372c276469643a6269643a65664474546a57424c6b4a6a7452534a464d66424c4e4a364c6a6e4b7531745627227d3080c2d72f380a",
"signData": "70b2ce583fb15b1e67e67e76ab3cfe491e819dbcfa3120946b98648be2f319961e3f148efc49c37dae8a6b71c17ac3c11a20caf58fa26513f86b0d4b209d7a09",
"publicKey": "b06566d8fb4a6dfbe0d5831e38f621391ad9191626f7e28c13d3a0482c52d5c9607b14"
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "*********"
}
2.10 签名
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
message |
string |
必填 |
待签名的信息 |
privateKey |
string |
必填 |
签名账户私钥 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.serialization |
string |
签名的信息 |
data.publicKey |
string |
星火公钥 |
data.signData |
string |
签名数据 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/sign
{
"message": "0a286469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f101f22ee01080752e9010a286469643a6269643a65664148557954796843645558537862337a6e77334a7734455432344764436b1abc017b2266756e6374696f6e223a22736166655472616e7366657246726f6d28616464726573732c616464726573732c737472696e6729222c2261726773223a226469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f2c6469643a6269643a6566314c38474273396d577a654b584769415a43383737575265737a3679372c276469643a6269643a65664474546a57424c6b4a6a7452534a464d66424c4e4a364c6a6e4b7531745627227d3080c2d72f3814",
"privateKey":"priSPKi7K3nVAgtdCu9k9hVn4modxzFkd73JGsRrUYJR1T2RxM"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"serialization": "0a286469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f101f22ee01080752e9010a286469643a6269643a65664148557954796843645558537862337a6e77334a7734455432344764436b1abc017b2266756e6374696f6e223a22736166655472616e7366657246726f6d28616464726573732c616464726573732c737472696e6729222c2261726773223a226469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f2c6469643a6269643a6566314c38474273396d577a654b584769415a43383737575265737a3679372c276469643a6269643a65664474546a57424c6b4a6a7452534a464d66424c4e4a364c6a6e4b7531745627227d3080c2d72f3814",
"publicKey": "b06566d8fb4a6dfbe0d5831e38f621391ad9191626f7e28c13d3a0482c52d5c9607b14",
"signData": "5c95d1ddc5fbf24439e4849034b863deb68c4681cf6dbc9d6b7a9d0b5ea6fbbe6a3933619099a0be29dfb4ceaaf614cba0582853fa48420a5b7dd81e28e44c04"
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "*********"
}
2.11 验签
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
serialization |
string |
必填 |
签名的信息 |
publicKey |
string |
必填 |
签名账户公钥 |
signData |
string |
必填 |
签名数据 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.verifySign |
Boolean |
验签结果 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/verifySign
{
"serialization": "0a286469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f101f22ee01080752e9010a286469643a6269643a65664148557954796843645558537862337a6e77334a7734455432344764436b1abc017b2266756e6374696f6e223a22736166655472616e7366657246726f6d28616464726573732c616464726573732c737472696e6729222c2261726773223a226469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f2c6469643a6269643a6566314c38474273396d577a654b584769415a43383737575265737a3679372c276469643a6269643a65664474546a57424c6b4a6a7452534a464d66424c4e4a364c6a6e4b7531745627227d3080c2d72f3814",
"signData": "22909a4bf1b0d310705eff9f736dd8755927c8f5d43d75d8602cd4097f08a6c7ea5cc824036679daf48a69910957f6d9ef7eabfe994c38391c2258aa07793b09",
"publicKey": "b06566d8fb4a6dfbe0d5831e38f621391ad9191626f7e28c13d3a0482c52d5c9607b14"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"verifySign": true
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "*******"
}
2.12 数据反序列化
请求参数:
字段名 |
类型 |
是否必填 |
描述 |
---|---|---|---|
serialization |
string |
必填 |
交易序列化数据 |
响应参数:
字段名 |
类型 |
描述 |
---|---|---|
code |
int |
成功200 ,失败非200 |
message |
string |
错误信息 |
data |
object |
|
data.SourceAddress |
string |
交易源账号 |
data.FeeLimit |
Long |
交易花费的手续费 |
data.GasPrice |
Long |
打包费用 |
data.Nonce |
Long |
账户交易序列号 |
data.ChainId |
Long |
链码 |
data.Operations |
object |
交易内容 |
示例:
(1)请求示例:
http请求方式:POST
https://{url}/bifApi/v1/deserialization
{
"serialization":"0a286469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f102122ee01080752e9010a286469643a6269643a65664148557954796843645558537862337a6e77334a7734455432344764436b1abc017b2266756e6374696f6e223a22736166655472616e7366657246726f6d28616464726573732c616464726573732c737472696e6729222c2261726773223a226469643a6269643a65665136394752745155445239536e6764464b4176346f7759797835466e6b6f2c6469643a6269643a6566314c38474273396d577a654b584769415a43383737575265737a3679372c276469643a6269643a65664474546a57424c6b4a6a7452534a464d66424c4e4a364c6a6e4b7531745627227d3080c2d72f380a"
}
(2)返回结果示例:
a. 接口调用成功,则返回JSON数据示例为:
{
"code": 200,
"data": {
"ChainId": 0,
"FeeLimit": 100000000,
"GasPrice": 10,
"Nonce": 33,
"Operations": [
{
"type": 7,
"pay_coin": {
"dest_address": "did:bid:efAHUyTyhCdUXSxb3znw3Jw4ET24GdCk",
"input": "{\"function\":\"safeTransferFrom(address,address,string)\",\"args\":\"did:bid:efQ69GRtQUDR9SngdFKAv4owYyx5Fnko,did:bid:ef1L8GBs9mWzeKXGiAZC877WResz6y7,'did:bid:efDtTjWBLkJjtRSJFMfBLNJ6LjnKu1tV'\"}"
}
}
],
"SourceAddress": "did:bid:efQ69GRtQUDR9SngdFKAv4owYyx5Fnko"
},
"message": "ok"
}
b. 接口调用失败,则返回JSON数据示例为:
{
"code": 500,
"data": "",
"message": "Invalid serialization"
}