Commit 95914416 authored by Zhang Xiaojie's avatar Zhang Xiaojie

feat:bass docs finished

parent 85483f59
......@@ -196,7 +196,7 @@ module.exports = {
title: '资金管理',
path: '/guide/companyController/Fee_balance',
children: [
'/guide/companyController/Fee_balance',
'/guide/companyController/Fee_balancePay',
'/guide/companyController/Fee_balanceWarning'
]
},
......@@ -221,8 +221,9 @@ module.exports = {
},
{
title: '发票管理',
path: '/guide/companyController/Fee_invoiceInfo',
path: '/guide/companyController/Fee',
children: [
'/guide/companyController/Fee',
'/guide/companyController/Fee_invoiceInfo',
'/guide/companyController/Fee_invoiceAdd',
'/guide/companyController/Fee_invoiceCreate',
......@@ -286,8 +287,182 @@ module.exports = {
'/guide/consortiumConsole/Chain_log',
'/guide/consortiumConsole/Chain_contract',
]
},
{
title: '应用管理',
path: '/guide/consortiumConsole/App_apply',
children: [
'/guide/consortiumConsole/App_apply',
'/guide/consortiumConsole/App_call',
'/guide/consortiumConsole/App_freeze',
'/guide/consortiumConsole/App_thaw',
'/guide/consortiumConsole/App_destroy',
]
},
{
title: '订单管理',
path: '/guide/consortiumConsole/Order_query',
children: [
'/guide/consortiumConsole/Order_query',
'/guide/consortiumConsole/Order_modify',
'/guide/consortiumConsole/Order_cancel',
'/guide/consortiumConsole/Order_refund',
]
},
{
title: '联盟用户管理',
path: '/guide/consortiumConsole/User',
children: [
'/guide/consortiumConsole/User_userManage',
'/guide/consortiumConsole/User_roleModify',
]
}
]
},
{
title: '告警管理',
path: '/guide/warning/Rule',
children: [
'/guide/warning/Rule',
'/guide/warning/NotifyRule',
'/guide/warning/WarningSet',
'/guide/warning/Handle'
]
},
{
title: '开发指南',
path: '/guide/devDocs/SdkVersion',
children: [
'/guide/devDocs/SdkVersion',
'/guide/devDocs/JavaSdk',
{
title: '系统接口',
path: '/guide/devDocs/GetPeerInfo',
children: [
'/guide/devDocs/GetPeerInfo',
'/guide/devDocs/GetNetInfo',
'/guide/devDocs/GetCryptoResult',
'/guide/devDocs/IsSync',
]
},
{
title: '区块链接口',
path: '/guide/devDocs/GetVersion',
children: [
'/guide/devDocs/GetVersion',
'/guide/devDocs/GetBlocks',
'/guide/devDocs/GetLastHeader',
'/guide/devDocs/GetBlockHash',
'/guide/devDocs/GetBlockOverview',
]
},
{
title: '交易接口',
path: '/guide/devDocs/SubmitTransaction',
children: [
'/guide/devDocs/SubmitTransaction',
'/guide/devDocs/QueryTransaction',
'/guide/devDocs/GetTxByHashes',
'/guide/devDocs/ConvertExectoAddr',
]
},
{
title: '密码相关接口',
path: '/guide/devDocs/Sha256',
children: [
{
title: '哈希算法',
path: '/guide/devDocs/Sha256',
children: [
'/guide/devDocs/Sha256',
'/guide/devDocs/Sm3',
]
},
{
title: '对称加密',
path: '/guide/devDocs/AesEnc',
children: [
'/guide/devDocs/AesEnc',
'/guide/devDocs/AesDec',
'/guide/devDocs/Sm4Enc',
'/guide/devDocs/Sm4Dec',
]
}
]
},
{
title: '合约接口',
path: '/guide/devDocs/NewAccountLocal',
children: [
{
title: '账户接口',
path: '/guide/devDocs/NewAccountLocal',
children: [
'/guide/devDocs/NewAccountLocal',
'/guide/devDocs/ValidAddress',
'/guide/devDocs/GenerateMnemonic',
'/guide/devDocs/CreateAccountBy33PATH'
]
},
{
title: '系统合约',
path: '/guide/devDocs/SimpleProof',
children: [
'/guide/devDocs/SimpleProof',
'/guide/devDocs/ManageContract',
{
title: '创世积分合约',
path: '/guide/devDocs/FirstBalance',
children: [
'/guide/devDocs/BalanceTransfer',
'/guide/devDocs/QueryBalance'
]
},
{
title: '自定义积分合约',
path: '/guide/devDocs/MyToken',
children: [
'/guide/devDocs/Prerelease',
'/guide/devDocs/OfficialRelease',
'/guide/devDocs/Transfer',
'/guide/devDocs/QueryCreateTokens',
'/guide/devDocs/GetTokenBalance',
]
},
]
},
{
title:'EVM合约',
path:'/guide/devDocs/DeployEvmContract',
children:[
'/guide/devDocs/DeployEvmContract',
'/guide/devDocs/CallEvmContract',
'/guide/devDocs/CallEvmAbi',
'/guide/devDocs/QueryEvmGas',
]
}
]
},
{
title:'Solidity合约开发部署',
path:'/guide/devDocs/ChainIde',
children:[
'/guide/devDocs/ChainIde',
'/guide/devDocs/Solidity',
'/guide/devDocs/NFT'
]
}
]
},
{
title:'常见问题',
path:'/guide/questions/BaasError',
children:[
'/guide/questions/BaasError',
'/guide/questions/CloudResource'
]
}
]
},
......
This diff is collapsed.
# 新功能发布动态
<font color="6B7280">最近更新时间:2021-12-24 10:21:11</font>
&emsp;&emsp;复杂美BaaS平台(Blockchain as a Service)是由杭州复杂美科技有限公司独立研发的一个区块链开放服务平台,具备便捷创建、一键部署、可视化监控区块链的能力,适用于联盟成员之间构建区块链网络,进行存证上链、资产数字化、智能合约等基础设施建设。
## 平台架构
![](../assets/download.jpg)
+ 区块链底层
复杂美BaaS平台依托于区块链底层系统Chain33开放区块链服务。Chain33采用了插件式架构设计,包含智能合约模块、共识模块、P2P网络模块、数据存储模块、加密算法模块等。在实际业务需求中,可根据业务需要选择合适的插件快速创建个性链。
+ 区块链管理平台
BaaS平台的核心能力层,包含诸多管理功能,如节点管理、节点监控、用户权限管控等多种功能,助力企业轻松管理区块链。
+ 应用场景
BaaS平台适用于多种应用场景,如供应链金融、电子合同、存证溯源、版权保护、区块链聊天等。
\ No newline at end of file
......@@ -6,7 +6,7 @@
**前提条件**
- 已购买或发布应用。更多信息,请参见[购买应用](https://baas.33.cn/doc/detail/194)[发布应用](https://baas.33.cn/doc/detail/195)
- 已购买或发布应用。更多信息,请参见[购买应用](../companyController/App_purchase.md)[发布应用](../companyController/App_upload.md)
- 已提前准备好自备节点服务器的基础信息,如IP地址、登录用户、密码和SSH端口。
- 自备节点服务器已安装Ansible工具,且在2.7版本及以上。
......@@ -28,7 +28,7 @@
| 登录类型 | 目前区块链节点支持**账号+密码****账号+密钥**两种登录方式,您可以根据实际需求选择其中一种登录方式。账号+密码:请输入自备节点的实际登录账号和密码。账号+密钥:输入自备节点的实际登录账号,然后选择已生成或已导入的私钥。 |
| SSH端口 | 输入准备好的服务器SSH端口。 |
1. 单击底部的**离线部署**,然后确认使用离线部署方式。 说明:如果是关联联盟链,则需要联盟链管理员审批应用部署流程,相关文档请参见[审批应用部署](https://baas.33.cn/doc/detail/246)
1. 单击底部的**离线部署**,然后确认使用离线部署方式。 说明:如果是关联联盟链,则需要联盟链管理员审批应用部署流程,相关文档请参见[审批应用部署](../companyController/App_offlineDeploy.md)
2. 生成下载地址。在**我部署的 > 部署中**目录下,选择应用,单击**查看下载地址**,系统自动上传部署文件并生成下载地址。
![](../../assets/cc40.jpg)
......
......@@ -5,7 +5,7 @@
应用市场中预置了一些应用,可直接供用户购买;同时也支持用户购买应用开发者发布到应用市场的应用,购买过程中需要支付一定费用,以奖励应用开发者。
如果需要购买开发者应用,则应用开发者需要提前将自己的应用发布到应用市场,以供其他账户购买。应用发布到应用市场的具体操作,请参见[上架应用市场](https://baas.33.cn/doc/detail/196)
如果需要购买开发者应用,则应用开发者需要提前将自己的应用发布到应用市场,以供其他账户购买。应用发布到应用市场的具体操作,请参见[上架应用市场](../companyController/App_appMarket.md)
**操作步骤**
......
......@@ -14,4 +14,4 @@
![](../../assets/cc44.jpg)
说明:发布应用升级版后,进入审批中状态,需要联系系统管理员审批发布应用升级版流程。待审批通过后,进入待上架状态,需要上架到应用市场,上架后自动替换旧版本应用。如何上架应用市场,请参见[上架应用市场](https://baas.33.cn/doc/detail/196)
\ No newline at end of file
说明:发布应用升级版后,进入审批中状态,需要联系系统管理员审批发布应用升级版流程。待审批通过后,进入待上架状态,需要上架到应用市场,上架后自动替换旧版本应用。如何上架应用市场,请参见[上架应用市场](../companyController/App_appMarket.md)
\ No newline at end of file
......@@ -2,7 +2,7 @@
<font color="6B7280">最近更新时间:2021-09-16 14:38:37</font>
### 创建部署申请
1. 登录复杂美BaaS平台,在页面左上角切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为企业控制台。
2. 在导航栏中选择应用管理 > 我的应用,单击已购买的页签。
3. 在已购买的页签下,单击explorer应用的操作列下的部署到链。
4. 在部署到链页面的安装信息区域,选择关联链和服务器类型,然后设置服务器信息。
......@@ -38,7 +38,7 @@ SSH端口 | 设置SSH端口,一般设置为22。
说明:如果区块链关联的是联盟链,部署区块链浏览器时需要联盟管理者审批部署浏览器的申请。
1. 登录复杂美BaaS平台,在页面左上角切换为联盟控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为联盟控制台。
2. 在导航栏中选择应用管理 > 链应用,然后单击审批中页签。
3. 在审批中页签下,选择explorer应用,单击操作列下的通过或者拒绝。
![](../../assets/start25.jpg)
......@@ -48,7 +48,7 @@ SSH端口 | 设置SSH端口,一般设置为22。
说明:如果是部署到自动分配的云服务器上,则需要支付云服务器的费用订单。如果是部署到自备服务器,则无需支付额外费用直接可以进行下一步骤(部署区块链浏览器)。
1. 登录复杂美BaaS平台,在页面左上角切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为企业控制台。
2. 在导航栏中选择应用管理 > 我的应用,然后单击我部署的状态页签。
3. 在我部署的页签下,单击部署中状态页签。
4. 在部署中状态页签下,选择explorer应用,单击操作列下的去支付。
......@@ -60,7 +60,7 @@ SSH端口 | 设置SSH端口,一般设置为22。
说明:如果是使用自动分配的云服务器,则需要先支付订单,才可以开始部署区块链浏览器;如果使用自备服务器,则可以直接开始部署。
1. 登录复杂美BaaS平台,在页面左上角切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为企业控制台。
2. 在导航栏中选择应用管理 > 我的应用,然后单击我部署的状态页签。
3. 在我部署的页签下,单击部署中状态页签。
4. 在部署中状态页签下,选择explorer应用,单击操作列下的开始部署。
......
......@@ -5,7 +5,7 @@ BaaS平台支持从应用市场购买区块链浏览器应用并部署到链,
操作步骤
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在导航栏中选择**应用管理 > 应用市场**
......
# 卸载区块链浏览器
<font color="6B7280">最近更新时间:2021-09-16 14:38:52</font>
1. 登录复杂美BaaS平台,在页面左上角切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为企业控制台。
2. 在左侧导航栏选择应用管理 > 我的应用,然后单击我部署的状态页签。
......
......@@ -13,16 +13,16 @@ BaaS蟷ウ蜿ー謾ッ謖∝蟒コ蜊穂シ∽ク夊#逶滄得蜥悟、壻シ∽ク夊#逶滄得縲ょ黒莨∽ク夊#逶滄
### 前提条件
如果需要创建单企业联盟链,请确保已完成以下事项:
+ 当前账户已经在个人控制台添加企业信息,并通过系统管理员审批。如何添加企业信息,请参见创建企业。
+ 创建联盟链时需要设置管理员地址和积分地址。如何创建或导入链地址,请参见链地址管理。
+ 当前账户已经在个人控制台添加企业信息,并通过系统管理员审批。如何添加企业信息,请参见[创建企业](../selfController/Company_create.md)
+ 创建联盟链时需要设置管理员地址和积分地址。如何创建或导入链地址,请参见[链地址管理](../selfController/Chain_address.md)
+ 如果您需要通过自备节点来部署区块链,请提前准备好节点信息,如IP地址、账号、密码等基础信息。
+ 如果您需要使用云服务器来部署区块链,请提前联系系统管理员申请定制套餐并完成套餐的定价。
+ 如果企业用户需要使用自己的云资源创建联盟链,需要提前对接云平台并配置云资源套餐。如何对接云平台和配置云资源套餐,请参见配置云平台和创建云资源套餐。
+ 如果需要使用密钥登录区块链节点,请先在个人控制台生成或导入私钥。如何生成或导入私钥,请参见密钥管理。
+ 在支付创建联盟链的订单前,请确保当前企业的账户余额充足。如何充值,请参见账户充值。
+ 如果企业用户需要使用自己的云资源创建联盟链,需要提前对接云平台并配置云资源套餐。如何对接云平台和配置云资源套餐,请参见[配置云平台](../companyController/Cloud_config.md)[创建云资源套餐](../questions/CloudResource.md)
+ 如果需要使用密钥登录区块链节点,请先在个人控制台生成或导入私钥。如何生成或导入私钥,请参见[密钥管理](../selfController/Chain_key.md)
+ 在支付创建联盟链的订单前,请确保当前企业的账户余额充足。如何充值,请参见[账户充值](../companyController/Fee_balancePay.md)
### 步骤一:创建联盟链
1. 登录复杂美BaaS平台,在页面左上角切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为企业控制台。
2. 在左侧导航栏选择链管理 > 联盟链,然后单击单企业创建。
3. 在基本信息区域,设置链名称,管理员地址和创世地址。
......@@ -84,4 +84,4 @@ IP蝨ー蝮 | 譌髴隶セ鄂ョ莠第恪蜉。蝎ィ逧鄂選P蝨ー蝮碁逕ィ閾ェ蜉ィ蛻讓。蠑上
8.**确认订单**导航页签下,确认订单信息,然后单击**确认**
9.**付款**导航页签下,确认订单支付金额,确认无误后单击确认付款。<br>如果您的当前余额不足以支付该订单金额,支持直接在当前页面进行充值。
支付订单完成后,返回联盟链页面,可以查看到已创建的单企业联盟链。创建单企业联盟链会自动生成一个以“企业名称+时间戳”命名的联盟,在企业控制台无法部署联盟链节点,您需要切换到联盟控制台进行操作,相关操作,请参见管理联盟链节点。
\ No newline at end of file
支付订单完成后,返回联盟链页面,可以查看到已创建的单企业联盟链。创建单企业联盟链会自动生成一个以“企业名称+时间戳”命名的联盟,在企业控制台无法部署联盟链节点,您需要切换到联盟控制台进行操作,相关操作,请参见[管理联盟链节点](../consortiumConsole/Chain_deploy.md)
\ No newline at end of file
......@@ -5,7 +5,7 @@
### 查看合约详情
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择链管理 > 合约详情。
......@@ -13,7 +13,7 @@
![](../../assets/cc14.png)
4. 后续可选操作。
+ 在页面左上角可进行调用、冻结和销毁合约,请参见调用应用、冻结应用和销毁应用
+ 在页面左上角可进行调用、冻结和销毁合约,请参见[调用应用](./LifeCircle_call.md)[冻结应用](./LifeCircle_freeze.md)[销毁应用](./LifeCircle_destroy.md)
+ 调用完成后,生成对应的交易ID,单击交易ID可跳转至区块链浏览器查看交易详情。
\ No newline at end of file
......@@ -5,7 +5,7 @@
### 查询链日志
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择链管理 > 链日志。
......
......@@ -3,7 +3,7 @@
注意:在新增节点前需要先部署平行链的初始节点。
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择**链管理 > 平行链**,选择需要增加节点的平行链。
......
......@@ -7,7 +7,7 @@ BaaS平台支持为自动分配的云服务器节点绑定公网IP。绑定公
### 操作步骤
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择**链管理 > 平行链**,切换到目标平行链。
......
......@@ -3,7 +3,7 @@
如果已在应用市场购买并安装区块链浏览器,交易数据自动上链。在平行链右上角单击浏览器,即跳转到区块链浏览器页面查询上链数据。
说明:如果未安装浏览器,请在企业控制台的应用市场购买explorer应用,并安装部署成功后才能正常使用查询上链数据功能。如何部署区块链浏览器,请参见区块链浏览器管理
说明:如果未安装浏览器,请在企业控制台的应用市场购买explorer应用,并安装部署成功后才能正常使用查询上链数据功能。如何部署区块链浏览器,请参见[区块链浏览器管理](../companyController/Browser_purchase.md)
+ 首页
根据地址、哈希值和区块高度进行搜索,查看上链记录、数据详情和区块详情。
......
......@@ -9,18 +9,18 @@
### 前提条件
如果需要创建平行链,请确保已完成以下事项:
+ 如果平行链关联本平台的联盟链,那么需要提前创建联盟链。如何创建联盟链,请参见创建单企业联盟链、创建多企业联盟链或导入联盟链。
+ 如果平行链关联本平台的联盟链,那么需要提前创建联盟链。如何创建联盟链,请参见[创建单企业联盟链](../start/Consortium_single.md)[创建多企业联盟链](../start/Consortium_multi.md)[导入联盟链](
+ 如果平行链关联外部链(自备链或者其他平台创建的链),那么需要提前准备好外部链的grpc地址,地址格式为“主链节点IP:grpc端口”。
+ 创建平行链时需要设置管理员地址和创世地址。如何创建或导入链地址,请参见链地址管理。
+ 创建平行链时需要设置管理员地址和创世地址。如何创建或导入链地址,请参见[链地址管理](../selfController/Chain_address.md)
+ 如果您需要通过自备节点来部署区块链,请提前准备好节点信息,如IP地址、账号、密码等基础信息。
+ 如果您需要使用云服务器来部署区块链,请提前联系系统管理员申请定制套餐并完成套餐的定价。
+ 如果需要使用密钥登录区块链节点,请先在个人控制台生成或导入私钥。如何生成或导入私钥,请参见密钥管理。
+ 在支付创建平行链的订单前,请确保企业账户余额充足。如何充值,请参见账户充值。
+ 如果需要使用密钥登录区块链节点,请先在个人控制台生成或导入私钥。如何生成或导入私钥,请参见[密钥管理](../selfController/Chain_key.md)
+ 在支付创建平行链的订单前,请确保企业账户余额充足。如何充值,请参见[账户充值](../companyController/Fee_balancePay.md)
### 操作步骤
1. 登录复杂美BaaS平台,在页面左上角切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为企业控制台。
2. 在左侧导航栏选择链管理 > 平行链,然后单击新增平行链。
3. 在基本信息区域,设置链名称,管理员地址和创世地址。
......@@ -68,5 +68,5 @@ IP蝨ー蝮 | 譌髴隶セ鄂ョ莠第恪蜉。蝎ィ逧鄂選P蝨ー蝮碁逕ィ閾ェ蜉ィ蛻讓。蠑擾
9.**付款**导航页签下,确认订单支付金额,确认无误后单击确认付款。
如果您的当前余额不足以支付该订单金额,支持直接在当前页面进行充值。
支付订单完成后,返回平行链页面,可以查看到已创建的平行链。创建完成的平行链为未运行状态,需要进行节点部署才能正常运行。
如何部署节点,请参见部署节点。
如何部署节点,请参见[部署节点](../companyController/Chain_parallelDeploy.md)
\ No newline at end of file
......@@ -10,7 +10,7 @@
**自动部署**
1. 登录复杂美BaaS平台,在页面左上角切换为联盟控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为联盟控制台。
2. 在左侧导航栏单击链管理 > 平行链,然后在页面左上角切换到未运行的联盟链。
3. 在联盟链基础信息区域右上角,单击**节点部署**
![](../../assets/start34.jpg)
......@@ -23,7 +23,7 @@
注意:手动部署仅支持在Linux环境下运行,且Ansible版本必须大于2.7。
1. 下载手动部署包。
1. 登录复杂美BaaS平台,在页面左上角切换为联盟控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为联盟控制台。
2. 在左侧导航栏选择链管理 >平行链,然后在页面左上角切换到未运行的联盟链。
3. 在平行链的基础信息区域右上角,单击节点部署。
4. 在节点部署对话框的确认部署方式导航页签下,下载手动部署包。
......
......@@ -10,14 +10,14 @@ BaaS蟷ウ蜿ー髯、莠庄莉・蛻帛サコ蛹コ蝮鈴得螟厄シ御ケ滓髪謖∝ッシ蜈・蜈カ莉門ケウ蜿ー逧玄蝮鈴
### 前提条件
如果需要创建联盟链,请确保已完成以下事项:
+ 导入平行链时需要填写链节点信息,请提前准备好链节点基础信息,如登录信息(账号、密码或密钥)、SSH端口、IP地址。如果需要使用密钥登录链节点,请提前导入私钥。如果导入私钥,请参见密钥管理。
+ 导入的平行链如果需要关联当前BaaS平台创建的联盟链,请提前创建联盟链。如何创建联盟链,请参见创建单企业联盟链或创建多企业联盟链。
+ 导入平行链时需要填写链节点信息,请提前准备好链节点基础信息,如登录信息(账号、密码或密钥)、SSH端口、IP地址。如果需要使用密钥登录链节点,请提前导入私钥。如果导入私钥,请参见[密钥管理](../selfController/Chain_key.md)
+ 导入的平行链如果需要关联当前BaaS平台创建的联盟链,请提前创建联盟链。如何创建联盟链,请参见[创建单企业联盟链](../start/Consortium_single.md)[创建多企业联盟链](../start/Consortium_multi.md)
+ 导入的平行链如果需要关联外部链(自备链或其他平台创建的链),请提前准备好外部链的grpc地址,支持填写多个地址(格式为“主链节点IP:grpc端口”),地址间使用英文逗号分隔。
+ 如果需要导入全功能链,那么需要使用该链的链地址私钥,请提前导入该链的链地址。如何导入链地址,请参见链地址管理。
+ 导入链会收取一定的链管理费和节点费,在导入前请确保企业账户余额充足。如何充值,请参见账户充值。
+ 如果需要导入全功能链,那么需要使用该链的链地址私钥,请提前导入该链的链地址。如何导入链地址,请参见[链地址管理](../selfController/Chain_address.md)
+ 导入链会收取一定的链管理费和节点费,在导入前请确保企业账户余额充足。如何充值,请参见[账户充值](../companyController/Fee_balancePay.md)
### 步骤一:导入联盟链
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择链管理 > 平行链,然后单击导入平行链。
3. 在基本信息区域,选择关联主链,设置链名称,管理员地址和创世地址。
![](../../assets/start36.jpg)
......
......@@ -7,7 +7,7 @@
### 操作步骤
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择**链管理 > 平行链**
......
......@@ -8,7 +8,7 @@
### 操作步骤
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择链管理 > 平行链,选择待删除的平行链。
......
......@@ -7,7 +7,7 @@
**前提条件**
- 支持根据用户名或手机号添加用户,请提前获取用户名或手机号。
- 审批用户申请加入企业流程前,需先由企业发起加入企业的申请。如何申请加入企业,请参见[加入企业](https://baas.33.cn/doc/detail/163)
- 审批用户申请加入企业流程前,需先由企业发起加入企业的申请。如何申请加入企业,请参见[加入企业](../selfController/Company_join.md)
**添加企业用户**
......
# 创建联盟
<font color="6B7280">最近更新时间:2021-09-09 16:15:45</font>
1. 登录复杂美BaaS平台,在页面左上角切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为企业控制台。
2. 在首页加入联盟区域,单击创建联盟。
3. 在创建联盟对话框,设置联盟名称和联盟描述,然后单击确定。
![](../../assets/cc2.jpg)
......
......@@ -6,7 +6,7 @@
企业加入联盟是被动的过程,需要联盟先邀请企业并生成邀请码,企业才能通过邀请码加入联盟。联盟管理员如何邀请企业成为联盟成员,请参见联盟成员管理。
### 操作步骤
1. 登录复杂美BaaS平台,在页面左上角切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为企业控制台。
2. 在首页的加入联盟区域,单击加入联盟。
3. 在加入联盟对话框,输入联盟邀请码,然后单击确定。
![](../../assets/cc3.jpg)
......
# 发票管理
最近更新时间:2021-09-16 16:21:12
在复杂美BaaS平台已消费的金额,支持开具发票,已充值但未消费无法开具发票。当月产生的按需付费消费账单需要在次月3日后才可以开具发票。
\ No newline at end of file
# 账户充值
最近更新时间:2021-09-16 16:06:54
为保障在BaaS平台正常购买云资源和为到期云资源续费,请及时为账户进行充值。单词充值金额最低10元。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在首页页面的**费用概览**区域,单击**充值**
3.**充值**对话框,设置**充值金额**并勾选**我已了解**,然后单击**立即充值**
![](../../assets/cc101.png)
4.**支付**对话框,选择支付方式并支付相应金额。
暂时仅支持微信支付方式,需使用手机扫描支付。
......@@ -4,7 +4,7 @@
**前提条件**
如果需要支付订单,请确保当前账户余额充足。如果账户余额不足,请提前充值,请参见[账户充值](https://baas.33.cn/doc/detail/211)
如果需要支付订单,请确保当前账户余额充足。如果账户余额不足,请提前充值,请参见[账户充值](../companyController/Fee_balancePay.md)
**操作步骤**
......
......@@ -7,12 +7,12 @@
部署存证服务应用,请确保已完成以下事项:
+ 从应用市场中购买存证服务应用需要支付小额费用,如果选择部署到云服务器还需要支付云资源费用,请确保企业账户余额充足。企业账户如需充值,请参见账户充值
+ 从应用市场中购买存证服务应用需要支付小额费用,如果选择部署到云服务器还需要支付云资源费用,请确保企业账户余额充足。企业账户如需充值,请参见[账户充值](../companyController/Fee_balancePay.md)
+ 如果是部署到自备服务器,请提前准备好节点信息、如IP地址、账号、密码等信息。
### 步骤一:购买存证服务
1. 登录复杂美BaaS平台,切换企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换企业控制台。
2. 在左侧导航栏选择应用管理 > 应用市场,然后搜索proof应用。
3. 查看proof应用信息,然后购买应用。
![](../../assets/cc18.jpg)
......
......@@ -7,12 +7,12 @@
部署存证服务应用,请确保已完成以下事项:
+ 从应用市场中购买存证服务应用需要支付小额费用,如果选择部署到云服务器还需要支付云资源费用,请确保企业账户余额充足。企业账户如需充值,请参见账户充值
+ 从应用市场中购买存证服务应用需要支付小额费用,如果选择部署到云服务器还需要支付云资源费用,请确保企业账户余额充足。企业账户如需充值,请参见[账户充值](../companyController/Fee_balancePay.md)
+ 如果是部署到自备服务器,请提前准备好节点信息、如IP地址、账号、密码等信息。
### 步骤一:购买存证服务
1. 登录复杂美BaaS平台,切换企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换企业控制台。
2. 在左侧导航栏选择应用管理 > 应用市场,然后搜索proof应用。
3. 查看proof应用信息,然后购买应用。
![](../../assets/cc18.jpg)
......
......@@ -3,7 +3,7 @@
注意:在新增节点前需要先部署平行链的初始节点。
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择**链管理 > 联盟链**,选择需要增加节点的联盟链。
......
......@@ -7,7 +7,7 @@ BaaS平台支持为自动分配的云服务器节点绑定公网IP。绑定公
### 操作步骤
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择**链管理 > 联盟链**,切换到目标平行链。
......
......@@ -5,7 +5,7 @@
### 查看合约详情
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择链管理 > 合约详情。
......
......@@ -16,7 +16,7 @@ BaaS平台支持在企业控制台创建单企业联盟链,在联盟控制台
+ 当前账户已经在个人控制台添加企业信息,并通过系统管理员审批。如何添加企业信息,请参见创建企业。
+ 当前账户已经在企业控制台创建联盟或被其他账户添加为某个联盟的用户。如何创建联盟和添加联盟用户,请参见创建联盟或添加联盟用户。
+ 请提前将需要添加的联盟节点的所属企业添加为联盟成员。如何添加联盟成员,请参见联盟成员管理。
+ 创建联盟链时需要设置管理员地址和积分地址。如何创建链地址,请参见链地址管理
+ 创建联盟链时需要设置管理员地址和积分地址。如何创建链地址,请参见[链地址管理](../selfController/Chain_address.md)
+ 如果您需要通过自备节点来部署区块链,请提前准备好节点信息,如IP地址、账号、密码等基础信息。
+ 如果您需要使用云服务器来部署区块链,请提前联系系统管理员申请定制套餐并完成套餐的定价。
......@@ -28,7 +28,7 @@ BaaS平台支持在企业控制台创建单企业联盟链,在联盟控制台
+ 当所有子订单交付完成后,您才可以继续执行相关链和节点的后续操作
### 操作步骤
1. 登录复杂美BaaS平台,在页面左上角切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为企业控制台。
2. 在左侧导航栏选择链管理 > 联盟链,然后单击单企业创建。
3. 在基本信息区域,设置链名称,管理员地址和创世地址。
......
......@@ -10,7 +10,7 @@
**自动部署**
1. 登录复杂美BaaS平台,在页面左上角切换为联盟控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为联盟控制台。
2. 在左侧导航栏单击链管理 > 平行链,然后在页面左上角切换到未运行的联盟链。
3. 在联盟链基础信息区域右上角,单击**节点部署**
![](../../assets/start34.jpg)
......@@ -26,7 +26,7 @@
注意:手动部署仅支持在Linux环境下运行,且Ansible版本必须大于2.7。
1. 下载手动部署包。
1. 登录复杂美BaaS平台,在页面左上角切换为联盟控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),在页面左上角切换为联盟控制台。
2. 在左侧导航栏选择**链管理 >平行链**,然后在页面左上角切换到未运行的联盟链。
3. 在平行链的基础信息区域右上角,单击**节点部署**
注意:部署节点前,节点状态必须为**创建完成**,否则部署将会失败。
......
......@@ -5,13 +5,13 @@
BaaS平台除了可以创建区块链外,也支持导入其他平台的区块链。导入链,分为导入只读链和全功能链。只读链,只能查看链的基础信息和监控数据;全功能链与新创建的链无差异,支持添加、部署、删除等节点管理,也可以部署合约并对合约进行管理。
### 前提条件
- 导入联盟链时需要填写链节点信息,请提前准备好链节点基础信息,如登录信息(账号、密码或密钥)、SSH端口、IP地址。如果需要使用密钥登录链节点,请提前导入私钥。如果导入私钥,请参见[密钥管理](https://baas.33.cn/doc/detail/267)
- 如果需要导入全功能链,那么需要使用该链的链地址私钥,请提前导入该链的链地址。如何导入链地址,请参见[链地址管理](https://baas.33.cn/doc/detail/266)
- 导入链会收取一定的链管理费和节点费,在导入前请确保您的余额充足。如何充值,请参见[账户充值](https://baas.33.cn/doc/detail/211)
- 导入联盟链时需要填写链节点信息,请提前准备好链节点基础信息,如登录信息(账号、密码或密钥)、SSH端口、IP地址。如果需要使用密钥登录链节点,请提前导入私钥。如果导入私钥,请参见[密钥管理](../selfController/Chain_key.md)
- 如果需要导入全功能链,那么需要使用该链的链地址私钥,请提前导入该链的链地址。如何导入链地址,请参见[链地址管理](../selfController/Chain_address.md)
- 导入链会收取一定的链管理费和节点费,在导入前请确保您的余额充足。如何充值,请参见[账户充值](../companyController/Fee_balancePay.md)
### 步骤一:导入联盟链
1. 登录复杂美BaaS平台,切换为联盟控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为联盟控制台。
2. 在左侧导航栏选择链管理 > 联盟链,然后单击导入联盟链。
3. 在基本信息区域,设置链名称,管理员地址和创世地址。
![](../../assets/start17.jpg)
......
......@@ -5,7 +5,7 @@
### 查询链日志
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择链管理 > 链日志。
......
......@@ -7,7 +7,7 @@
### 操作步骤
1. 登录复杂美BaaS平台,切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
2. 在左侧导航栏选择**链管理 > 联盟链**
......
......@@ -28,7 +28,7 @@
**安全预警**区域,您可以查看到当前账户下的危险、警告和信息类预警提示数量。
如果需要新增告警规则,请单击规则设置。跳转到告警组设置页面,请根据需要设置告警规则,设置告警规则的具体操作,请参见[管理告警通知规则](https://baas.33.cn/doc/detail/259)
如果需要新增告警规则,请单击规则设置。跳转到告警组设置页面,请根据需要设置告警规则,设置告警规则的具体操作,请参见[管理告警通知规则](../warning/NotifyRule.md)
**待办事项**
......
......@@ -3,11 +3,11 @@
**前提条件**
如果需要支付订单,请确保当前账户余额充足。如果账户余额不足,请提前充值,请参见[账户充值](https://baas.33.cn/doc/detail/211)
如果需要支付订单,请确保当前账户余额充足。如果账户余额不足,请提前充值,请参见[账户充值](../companyController/Fee_balancePay.md)
**操作步骤**
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为联盟控制台。
2. 在左侧导航栏选择**费用中心 > 订单管理**
......
......@@ -2,7 +2,7 @@
最近更新时间:2021-09-16 17:50:40
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为联盟控制台。
2. 在左侧导航栏选择**费用中心 > 订单管理**
......
......@@ -2,7 +2,7 @@
最近更新时间:2021-09-16 17:48:45
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为联盟控制台。
2. 在左侧导航栏选择**费用中心 > 订单管理**
......
# 联盟用户管理
最近更新时间:2021-09-16 16:37:48
联盟成员和联盟用户是不同的。
联盟成员是以企业为维度的,成员只能在企业控制台查看联盟链监控数据,不能进行任何操作。
联盟用户是以用户为维度的,支持为联盟用户赋予不同角色,不同角色拥有不同权限,联盟用户可以进到该联盟的控制台进行一系列的操作。
| **角色** | **描述** |
| ---------- | ------------------------------------------ |
| 联盟所有者 | 创建联盟的用户,或后拥有联盟所有权的用户。 |
| 联盟管理者 | 被联盟所有者授权,参与联盟的日常管理操作。 |
| 联盟成员 | 联盟普通成员,一般执行联盟的只读操作。 |
......@@ -26,4 +26,4 @@
4.**变更角色**对话框,选择需要切换的角色,然后单击**变更角色**
![](../../assets/cc72.jpg)
![](../../assets/cc91.jpg)
......@@ -2,39 +2,31 @@
最近更新时间:2021-09-16 17:58:54
支持对联盟业用户进行管理,包括添加、审批和移除用户。
支持对联盟用户进行管理,包括添加用户和移除用户。
**前提条件**
添加用户前,请确保用户管理的企业已经被添加为联盟成员。如何添加联盟成员,请参见联盟成员管理
添加用户前,请确保用户管理的企业已经被添加为联盟成员。如何添加联盟成员,请参见[联盟成员管理](../consortiumConsole/User.md)
**添加企业用户**
**添加联盟用户**
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台。
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为联盟控制台。
2. 在左侧导航栏选择**设置** **>** **用户管理**,单击页面右上角的**添加用户**
3.**添加用户**对话框,输入用户名称或者手机号,设置角色,然后单击**添加用户**
3.**添加用户**对话框,选择企业,输入用户名称,设置角色,然后单击**添加用户**
添加用户无需用户同意,直接生效。企业用户可以进到该企业的控制台进行一系列的操作。
添加用户无需用户同意,直接生效。联盟用户可以进到该联盟的控制台进行一系列的操作。
![](../../assets/cc69.jpg)
**移除联盟用户**
**审批用户申请**
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为联盟控制台。
除了企业管理者主动企业用户外,还支持用户申请加入企业,申请加入企业需要企业管理者审批
2. 在左侧导航栏选择**设置** **>** **用户管理**
1. 登录[复杂美BaaS平台](https://baas.33.cn/),切换为企业控制台
3. 在用户列表中选择待移除用户,单击**操作**列下的**移除**
2. 在左侧导航栏选择**设置** **>** **用户管理**,单击页面右上角的用户申请提示语。
![](../../assets/cc70.jpg)
3. 在用户列表页面,选择目标用户,单击**操作**列下的**通过****拒绝**
4. 在审批对话框,填写备注信息,然后单击**确定**
说明:申请加入的企业用户,默认为企业员工角色。
\ No newline at end of file
4. 在移除用户确认对话框,单击**移除**
\ No newline at end of file
# aes解密
最近更新时间:2021-07-27 15:54:47
调用aes接口对上链内容做对称加密解密运算。
**函数原型**
**public static String decrypt(byte[] ivAndEncryptedMessage, String symKeyHex)**
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | ------------ | ---------- | -------------- |
| content | byte[] | 是 | | 链上存证内容。 |
| key | byte[] | 是 | | Aes key值。 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | ---------------------- |
| result | byte[] | | 解密运算后的byte数组。 |
**代码示例**
```java
//解密key。
String aesKeyHex = "ba940eabdf09ee0f37f8766841****";
// 从区块链上查询到的加密信息。
String result = "从区块链上查询到的加密信息";
byte[] fromHexString = HexUtil.hexStringToBytes(result);
String decrypt = AesUtil.decrypt(fromHexString, desKey);
```
\ No newline at end of file
# aes加密
最近更新时间:2021-07-27 15:51:51
调用aes接口对上链内容做对称加密运算。
**函数原型**
```java
public static byte[] encrypt(String content,byte[] symKeyData,byte[] ivData)
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| ---------- | -------- | ------------ | ---------- | ----------- |
| content | String | 是 | | 存证内容。 |
| symkeyData | byte[] | 是 | | Aes key值。 |
| ivData | byte[] | 是 | | Aes iv值。 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | ---------------------- |
| result | byte[] | | 加密运算后的byte数组。 |
**代码示例**
```java
//存证内容。
String content = "{"存证内容":"aes加密存证","存证时间":"20210719"}";
//生成AES加密KEY。
String aesKeyHex = "ba940eabdf09ee0f37f876684****";
byte[] key = HexUtil.fromHexString(aesKeyHex);
// 生成iv。
byte[] iv = AesUtil.generateIv();
// 对明文进行加密。
byte[] encrypt = AesUtil.encrypt(content, key, iv);
```
\ No newline at end of file
# 积分转账
最近更新时间:2021-07-27 17:29:18
区块链自定义积分合约包含三个动作:1. 构造区块链自定义积分交易;2. 签名这笔交易;3.将这笔交易发送至区块链上。 其中1和2由transferBalanceMain函数完成, 3由submitTransaction完成
上链结果查询由queryTransaction完成
函数原型
```java
public static String transferBalanceMain(TransferBalanceRequest transferBalanceRequest)
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | ---------------------- | ------------ | ---------- | ---------- |
| request | TransferBalanceRequest | 是 | | 转账说明。 |
返回参数
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | -------------------- |
| result | String | | 构造并签好名的交易。 |
**代码示例**
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("localhost", 8801);
TransferBalanceRequest transferBalanceRequest = new TransferBalanceRequest();
//转账说明。
transferBalanceRequest.setNote("转账说明");
// 转账数量,以下示例代表转1个积分。
transferBalanceRequest.setAmount(1 100000000L);
// 转到的地址。
transferBalanceRequest.setTo("1CbEVT9RnM5oZhWMj4fxUrJX94VtRotzvs");
transferBalanceRequest.setCoinToken("");
// TODO:签名私钥,转出地址的私钥,如果是从创世地址中转出,则填写创世地址的私钥。
transferBalanceRequest.setFromPrivateKey("签名私钥");
// 执行器名称,主链主积分固定为coins。
transferBalanceRequest.setExecer("coins");
// 签名类型 (支持SM2, SECP256K1, ED25519)。
transferBalanceRequest.setSignType(SignType.SECP256K1);
// 构造好,并本地签好名的交易。
String createTransferTx = TransactionUtil.transferBalanceMain(transferBalanceRequest);
// 将构造并签好名的交易发送到区块链上。
String hash = client.submitTransaction(createTransferTx);
System.out.println(hash);
Thread.sleep(2000);
// 根据上链返回的hash查询上链交易是否执行成功,区块链执行是一个异步的过程,调用上链接口会实时返回hash,但此时还未上链成功,真正能查到数据后才是上链成功。
QueryTransactionResult queryTransaction = client.queryTransaction(hash);
if (null != queryTransaction) {
int result = queryTransaction.getReceipt().getTy();
if(result == 2) {
​ System.out.println("转账交易执行成功");
}
}
```
\ No newline at end of file
# EVM查询功能
最近更新时间:2021-08-10 20:22:01
### 通过callEVMAbi方法,调用EVM合约中的查询方法
函数原型
```java
public JSONObject callEVMAbi(String address, String abiPack)
```
**请求参数**
| **参数** | **必选** | **类型** | **说明** |
| ------------ | -------- | -------- | -------------------------- |
| contractAddr | 是 | String | 部署的合约在区块链上的地址 |
| abiPack | 是 | Byte[] | 合约中查询方法和入参 |
返回字段
| **返回字段** | **字段类型** | **说明** |
| ------------ | ------------ | -------------------- |
| result | JsonObject | 查询结果集的json对象 |
**代码示例**
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
String abi = "ABI内容";
// 计算合约地址
String contractAddress = TransactionUtil.convertExectoAddr(address + "部署EVM合约返回的交易hash".substring(2));
System.out.println("部署好的合约地址 = " + contractAddress);
byte[] packAbiGet = EvmUtil.encodeParameter(abi, "查询方法", "查询方法入参");
JSONObject query = client.callEVMAbi(contractAddress, HexUtil.toHexString(packAbiGet));
JSONObject output = query.getJSONObject("result");
List<?> result = EvmUtil.decodeOutput(abi, "查询方法", output);
System.out.println("根据ID从链上的查询结果:" + result);
\ No newline at end of file
# 调用EVM合约
最近更新时间:2021-08-10 20:21:42
### 通过callEvmContract调用EVM合约方法
函数原型
```java
public static String callEvmContract(byte[] parameter, String note, long amount, String contractAddr, String privateKey, String paraName)
```
**请求参数**
| **参数** | **必选** | **类型** | **说明** |
| ------------ | -------- | -------- | ---------------------------------------- |
| parameter | 是 | Byte[] | Solidity合约中相应的方法和入参 |
| Note | 否 | String | 合约的注释 |
| amount | 否 | long | 金额 |
| contractAddr | 是 | String | 部署的合约在区块链上的地址 |
| privateKey | 是 | String | 签名用私钥 |
| paraName | 否 | String | 平行链名称(当合约部署到平行链时用填写) |
返回字段
| **返回字段** | **字段类型** | **说明** |
| ------------ | ------------ | -------------- |
| result | String | 构造好的交易体 |
**代码示例**
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 合约代码:https://bty33.oss-cn-shanghai.aliyuncs.com/chain33Dev/BAAS/%E5%AD%98%E8%AF%81%E5%90%88%E7%BA%A6.zip
String abi = "ABI内容";
// 计算合约地址
String contractAddress = TransactionUtil.convertExectoAddr(address + "部署EVM合约返回的交易hash".substring(2));
System.out.println("部署好的合约地址 = " + contractAddress);
// 调用合约
byte[] method = EvmUtil.encodeParameter(abi, "合约中方法名", "方法入参");
String txEncode = EvmUtil.callEvmContract(method,"", 0, contractAddress, privateKey, "");
String txhash = client.submitTransaction(txEncode);
System.out.println(txhash);
Thread.sleep(2000);
// 根据上链返回的hash查询上链交易是否执行成功,区块链执行是一个异步的过程,调用上链接口会实时返回hash,但此时还未上链成功,真正能查到数据后才是上链成功。*
QueryTransactionResult queryTransaction = client.queryTransaction(txhash);
if (null != queryTransaction) {
int result = queryTransaction.getReceipt().getTy();
if(result == 2) {
​ System.out.println("部署合约交易执行成功");
}
}
\ No newline at end of file
# ChainIDE配置与使用
最近更新时间:2021-08-30 17:10:20
ChainIDE合约开发环境(以下简称“IDE”)是BAAS平台提供的在线合约开发工具。此工具为智能合约开发提供简单、高效的集成环境。
IDE主要提供以下核心功能:
- 合约工程的创建、删除;工程文件的复制、删除等基础管理。
- 提供默认体验链环境和测试账户,用来测试合约的部署和调用。
- 合约编辑与编译,展示编译结果字节码(BYTE CODE)和接口说明(ABI)。
**ChainIDE功能入口**
1. 登录[复杂美BAAS平台](https://baas.33.cn/)
2. 在顶部导航栏单击**在线IDE**
![](../../assets/w8.jpg)
**ChainIDE****合约开发流程**
**步骤一:创建测试账户**
1. 在IDE页面右下角单击**chainide**,然后单击![](../../assets/w9.jpg)图标。
2. 单击**create account**,设置测试帐户名称(支持大小写字母和数字),然后单击**Create**
![](../../assets/w10.jpg)
**步骤二:编写合约**
1. 选择一种方式,创建一个新的合约工程。
- 在IDE首页左上角,直接单击**Create Project**
- 单击IDE左上角的![](../../assets/w11.jpg)图标,然后选择**Projects > New Project**
2. 在工程下的.sol文件中编写合约代码。
- 新建工程会默认生成一个**Storage.sol**文件,可以在该文件中直接编写合约代码。
- 您也可以自行创建一个.sol文件,然后编写合约代码。
![](../../assets/w12.jpg)
**步骤三:编译合约**
合约开发过程中,可以随时对已完成的代码进行编译。
1. 在IDE页面,单击右上角的**Compile**
2. 选择编译器版本,然后单击**Compile xxx.sol**
![](../../assets/w13.jpg)
合约代码编译成功,会打印“Compile contract success”信息。
- ABI
合约接口说明,即应用程序二进制接口(Application Binary Interface,ABI)。可以理解为合约的接口说明。当合约被编译后,其对应的ABI也会一起生成。
- BYTE CODE
字节码,即合约代码的编译结果,也是合约部署时使用的关键数据,通过SDK可以将合约字节码部署到目标的生产链上使用。
ABI类似于程序的接口说明文档,描述了属性和方法签名相关信息,包括字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值等。
| **参数** | **描述** |
| --------------- | ------------------------------------------------------------ |
| name | 函数名称。 |
| type | 方法类型,包括function、constructor、fallback(缺省方法),默认function。 |
| constant | 布尔值,如果为true,则表示方法不会修改合约字段的状态变量。 |
| payable | 布尔值,表示方法是否可以接收系统转账。 |
| stateMutability | 状态类型,包括pure(不读取区块链状态)、view(和constant类型相同,只能查看,不会修改合约字段)、nonpayable(和payable含义相同)、payable(和payable含义相同)。 |
| inputs | 数组,描述参数的名称和类型。 |
| name | 参数名称。 |
| type | 参数类型。 |
| outputs | 和inputs相同,如果没有返回值,缺省是一个空数组。 |
如果需要了解更多合约接口说明(ABI)相关信息,请参见[API官方介绍](https://docs.soliditylang.org/en/v0.4.24/abi-spec.html?spm=a2c4g.11186623.2.13.1c865bd2fv0E7S)
**步骤四:部署合约**
合约编译成功,得到字节码(BYTE CODE)和合约接口说明(ABI)后,可以直接在IDE页面将合约部署到测试链。
1. 在IDE页面,单击右上角的**Deploy&interaction**
2. 在DEPLOY区域,单击**Deploy**,部署合约。
![](../../assets/w14.jpg)
合约部署成功后,会打印“Transaction has been submitted successfully.”信息。
3. 在IDE页面右侧,单击**Transaction**,然后选择任意交易记录并单击**more**,查看部署合约交易的具体执行结果。
receipt参数中“ty=2, tyName=ExecOk”, 表示合约部署交易执行成功。
![](../../assets/w15.jpg)
**步骤五:调用合约**
合约部署成功后,IDE会列出合约中所有的public方法以及public类型的状态变量。
如果是用默认的**Storage.sol**文件部署上链,可以按以下步骤调用合约。
1. 在IDE页面右下角的**INTERACT**区域,在**store**方法中设置mum后,单击**Submit**,进行数据上链。
2.**retrieve**方法中,单击**Submit**,查询上链数据。
![](../../assets/w16.jpg)
- store方法调用后会返回一串交易hash,在Transaction标签下可以查看这个hash对应交易的执行结果。
- retrieve方法调用后回返回查询结果,如“result = [{"name":"","type":"uint256","value":100}]”。
\ No newline at end of file
# convertExectoAddr
最近更新时间:2021-07-27 15:44:56
调用convertExectoAddr接口获取合约地址信息。
**函数原型**
```java
public String convertExectoAddr(String execername)
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| ---------- | -------- | ------------ | ---------- | -------- |
| execername | String | 是 | token | 合约名。 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | -------------------------------- | ---------- |
| result | String | 12hpJBHybh1mSyCijQ2MQJPk7z7k**** | 合约地址。 |
**代码示例**
```java
// 同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 根据合约名称获取合约的区块链地址。
String address = client.convertExectoAddr("token");
```
**返回值示例**
12hpJBHybh1mSyCijQ2MQJPk7z7kZ7jnQa
\ No newline at end of file
# 助记词推导出公私钥和地址
最近更新时间:2021-08-10 22:19:37
# 助记词推导出公私钥和地址
调用createAccountBy33PATH生成公私钥和地址
**函数原型**
```java
public static AccountInfo createAccountBy33PATH(String word, int childIndex)
```
**请求参数**
| **名称** | **类型** | **位置** | **是否必选** | **示例值** | **描述** |
| ---------- | -------- | -------- | ------------ | ---------- | ----------- |
| word | String | | 是 | | 助记词 |
| childIndex | Int | | 是 | | 子私钥index |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | ----------- | ---------- | ------------------------------ |
| result | AccountInfo | | 账户对象,包含私钥,公钥和地址 |
**代码示例**
```java
// 根据助记词生成私钥,公钥,地址
AccountInfo info = SeedUtil.createAccountBy33PATH("助记词内容", 0);
System.out.println("privateKey is:" + info.getPrivateKey());
System.out.println("publicKey is:" + info.getPublicKey());
System.out.println("Address is:" + info.getAddress());
```
**返回值示例**
```
privateKey is:523549b795e7ad8e5d6b8d96321efbd05a47175a447f2229022d4b5ce069eb20
publicKey is:03ef176092b86b09dffe900d622b7d50b22a6bd0af983d72ed8176b382254e96f8
Address is:1JRVD7FP4pHUTQ64AUg5EbFGv4Fjbx6vZ9
```
\ No newline at end of file
# 部署EVM合约
最近更新时间:2021-08-10 20:21:19
### 部署EVM合约
### 调用createEvmContract往区块链上部署EVM合约
函数原型
```java
public static String createEvmContract(byte[] code, String note, String alias, String privateKey, String paraName)
```
**请求参数**
| **参数** | **必选** | **类型** | **说明** |
| ---------- | -------- | -------- | -------------------------------------------------- |
| Code | 是 | Byte[] | Solidity合约代码内容:包含二进制码和abi的merge结果 |
| Note | 否 | String | 合约的注释 |
| Alias | 否 | String | 合约别名 |
| privateKey | 是 | String | 签名用私钥 |
| paraName | 否 | String | 平行链名称(当合约部署到平行链时用填写) |
返回字段
| **返回字段** | **字段类型** | **说明** |
| ------------ | ------------ | -------------- |
| result | String | 构造好的交易体 |
**代码示例**
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 合约代码:https://bty33.oss-cn-shanghai.aliyuncs.com/chain33Dev/BAAS/%E5%AD%98%E8%AF%81%E5%90%88%E7%BA%A6.zip
String codes = "solidity编译出来的字节码";
String abi = "ABI内容";
byte[] code = ByteUtil.merge(HexUtil.fromHexString(codes), abi.getBytes());
String txEncode = EvmUtil.createEvmContract(code, "", "evm-sdk-test", privateKey, "");
String txhash = client.submitTransaction(txEncode);
System.out.println(txhash);
Thread.sleep(5000);
// 根据上链返回的hash查询上链交易是否执行成功,区块链执行是一个异步的过程,调用上链接口会实时返回hash,但此时还未上链成功,真正能查到数据后才是上链成功。*
QueryTransactionResult queryTransaction = client.queryTransaction(txhash);
if (null != queryTransaction) {
int result = queryTransaction.getReceipt().getTy();
if(result == 2) {
​ System.out.println("部署合约交易执行成功");
}
}
\ No newline at end of file
# 创世积分合约
最近更新时间:2021-07-27 17:34:48
联盟链和平行链在初始化部署时,创世区块中默认会生成1亿创世积分,并且这些创世积分会分配到创世地址下,此积分后续不支持增发。 对于一条确定的链来说,有且只有一个创世积分。
创世积分合约包含以下2个接口:
+ 积分转账
+ 查询帐户余额
\ No newline at end of file
# 生成离线助记词
最近更新时间:2021-08-10 22:19:01
# 生成离线助记词
调用generateMnemonic生成助记词
**函数原型**
```java
public static String generateMnemonic()
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | ------------ | ---------- | -------- |
| | | | | |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | ------------------ |
| result | String | | 15个英文字符助记词 |
**代码示例**
```java
// 生成助记词
String mnemonic = SeedUtil.generateMnemonic();
System.out.println("助记词:" + mnemonic);
```
返回值示例
```
black neglect sudden twelve worth blade degree spin liberty pair census donkey cricket ankle bounce
```
\ No newline at end of file
# getBlockHash
最近更新时间:2021-07-16 16:30:39
调用getBlockHash接口查询指定区块高度的区块的哈希值。
**函数原型**
```java
public String getBlockHash(Long height)
```
**请求参数**
| 参数 | 类型 | 是否必选 | 示例值 | 说明 |
| ------ | ---- | -------- | ------ | -------- |
| height | Long | 是 | 1 | 区块高度 |
**返回字段**
| 返回字段 | 类型 | 示例值 | 描述 |
| -------- | ------ | -------------------------- | -------- |
| result | String | 0x572d35443706******ab7d0f | 区块哈希 |
**代码示例**
```java
// 同区块链建立rpc连接,IP地址替换成区块链某个节点真实IP
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 获取区块hash
String blockhash = client.getBlockHash(1L);
```
\ No newline at end of file
# getBlockOverview
最近更新时间:2021-07-16 16:30:34
调用getBlockOverview接口查询指定哈希值的区块详细信息。
**函数原型**
```java
public BlockOverViewResult getBlockOverview(String hash)
```
**请求参数**
| 参数 | 类型 | 是否必选 | 示例值 | 说明 |
| ---- | ------ | -------- | -------------------------- | ------------ |
| hash | String | 是 | 0x572d35443706******ab7d0f | 区块的哈希值 |
**返回参数**
| 返回字段 | 类型 | 示例值 | 描述 |
| -------- | ------------------- | ------ | -------------- |
| result | BlockOverViewResult | 见下表 | 区块的详细信息 |
**参数详情**
| 参数 | 类型 | 描述 |
| ----------------------- | ------- | ---------------- |
| **BlockResult****对象** | | |
| version | Integer | 区块版本号 |
| parentHash | String | 上一个区块的哈希 |
| txHash | String | 交易默克尔根哈希 |
| stateHash | String | 状态哈希 |
| height | Long | 区块高度 |
| blockTime | Date | 区块时间 |
| txcount | Integer | 区块中交易笔数 |
| hash | String | 本区块哈希 |
**代码示例**
```java
// 同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 查询指定哈希值的区块详细信息。
BlockOverViewResult blockView = client.getBlockOverview("区块hash值");
```
**返回值示例**
```json
{
"txCount": 100,
"stateHash": "0xce1ee3f1943df19b1ca9d7c26870ed09b4bd46378d82ff80fdfdd30d409c8514",
"blockTime": 1630478768,
"parentHash": "0x30ea2f822a0efa0fa87dab148cf2d64f71de5dc2bde84414bbb6627113dbb646",
"version": 0,
"txHash": "0x197663736fa3364071137d7db55cf4f7a11f2a84b048ee3fa79cc89f602c54ae",
"hash": "0x80b3406a54ee4118cf32830c1fe3c70826cc9b25fd9f31f40238d8c4ff14450a",
"height": 87
}
```
\ No newline at end of file
# getBlocks
最近更新时间:2021-07-16 10:17:18
调用getBlocks接口查询一定区块高度范围的区块列表信息。
**函数原型**
```java
public List<BlocksResult> getBlocks(Long start, Long end, boolean isDetail)
```
**请求参数**
| 参数 | 必选 | 类型 | 说明 |
| -------- | ---- | ------- | -------------- |
| start | 是 | Long | 区块开始高度 |
| end | 是 | Long | 区块结束高度 |
| isDetail | 是 | Boolean | 是否要显示详情 |
**返回字段**
| 返回字段 | 字段类型 | 说明 |
| -------- | ------------------ | -------------- |
| result | List< BlocksResult > | 区块链版本信息 |
**参数详情**
| 参数 | 类型 | 描述 |
| ------------------------- | ------- | ------------------------------------------------------ |
| **BlocksResult****对象** | | |
| **BlockResult****子对象** | | |
| version | Integer | 区块版本号 |
| parentHash | String | 上一个区块的哈希 |
| txHash | String | 交易默克尔根哈希 |
| stateHash | String | 状态哈希 |
| height | Long | 区块高度 |
| blockTime | Date | 区块时间 |
| txcount | Integer | 区块中交易笔数 |
| hash | String | 本区块哈希 |
| **Receipt****子对象列表** | | |
| ty | Integer | 交易执行结果标志。1 表示只被打包;2 表示打包进执行成功 |
| tyname | String | 执行结果 |
**代码示例**
```java
//同区块链建立rpc连接,IP地址替换成区块链某个节点真实IP
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 根据区块高度范围取区块信息
List<BlocksResult> blockResult = client.getBlocks(1L,2L,true);
```
**返回值示例**
``` json
{
"result":{
"items":[
{
"recipts":[
{
"tyName":"ExecOk",
"ty":2
]
}
],
"block":{
"difficulty":520159231,
"stateHash":"0x749902f5c153284926955092239d88d65fffc93af7509625e5573e7f21996da0",
"mainHeight":18,
"blockTime":1630045557,
"parentHash":"0xb021be18fbfb7a58b5de3a9a14de2c30fe174fa266cb4b686cc5d2bf8e2609db",
"version":0,
"txHash":"0x9aa1d7ce301481d9fe855b3b208146e7c00c1c0e2a3469fa7a649186ed2cdc60",
"txs":[交易列表],
"height":1
}
}
]
},
"id":2
}
```
\ No newline at end of file
# getCryptoResult
最近更新时间:2021-07-15 16:44:28
调用getCryptoResult接口查询系统支持的签名类型。
**函数原型**
``` java
public List<CryptoResult> getCryptoResult
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | ------------ | ---------- | -------- |
| | | | | |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | ------------------ | ---------- | -------------------- |
| result | List< CryptoResult > | | 支持的签名类型列表。 |
**参数详情**
| 参数 | 类型 | 描述 |
| ------------------------ | ------- | ---------- |
| **CryptoResult****对象** | | |
| name | String | 算法名称 |
| typeID | Integer | 算法类型ID |
**代码示例**
```java
//同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
//查询系统支持的签名列表。
List<CryptoResult> result = client.getCryptoResult();
```
**返回值示例**
```json
{
"name": "secp256k1",
"typeID": 1
}
```
\ No newline at end of file
# getLastHeader
最近更新时间:2021-07-16 10:02:58
调用getLastHeader接口查询最高(最新)的区块信息。
**函数原型**
```java
public BlockResult getLastHeader()
```
**请求参数**
| 参数 | 必选 | 类型 | 说明 |
| ---- | ---- | ---- | ---- |
| 空 | - | - | - |
**返回字段**
| 返回字段 | 字段类型 | 说明 |
| -------- | ----------- | ---------- |
| result | BlockResult | 区块头信息 |
**参数详情**
| 参数 | 类型 | 描述 |
| ----------------------- | ------- | ---------------- |
| **BlockResult****对象** | | |
| version | Integer | 区块版本号 |
| parentHash | String | 上一个区块的哈希 |
| txHash | String | 交易默克尔根哈希 |
| stateHash | String | 状态哈希 |
| height | Long | 区块高度 |
| blockTime | Date | 区块时间 |
| txcount | Integer | 区块中交易笔数 |
| hash | String | 本区块哈希 |
**代码示例**
```java
// 同区块链建立rpc连接,IP地址替换成区块链某个节点真实IP
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 获取区块头信息
```
BlockResult blockResult = client.getLastHeader();
**返回值示例**
"result": {
"version": 0,
"parentHash": "0x30ea2f822a0efa0fa87dab148cf2d64f71de5dc2bde84414bbb6627113dbb646",
"txHash": "0x197663736fa3364071137d7db55cf4f7a11f2a84b048ee3fa79cc89f602c54ae",
"stateHash": "0xce1ee3f1943df19b1ca9d7c26870ed09b4bd46378d82ff80fdfdd30d409c8514",
"height": 87,
"blockTime": 1630478768,
"txCount": 100,
"hash": "0x80b3406a54ee4118cf32830c1fe3c70826cc9b25fd9f31f40238d8c4ff14450a",
"difficulty": 520159231
}
\ No newline at end of file
# getNetInfo
最近更新时间:2021-08-15 16:48:02
调用getNetInfo接口查询节点状态。
**函数原型**
**public NetResult getNetInfo(**)
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | ------------ | ---------- | -------- |
| 空 | - | - | - | - |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| ---------- | ------------- | ---------------- | ---------------- |
| **result** | **NetResult** | **见返回值示例** | **节点网络信息** |
**参数详情**
| **参数** | **类型** | **描述** |
| --------------------- | -------- | ------------------------------------------------------------ |
| **NetResult****对象** | | |
| externaladdr | String | 表示自身的外网地址信息 |
| localaddr | String | 表示节点监听的本地地址信息 |
| service | boolean | 为true 时,表示别的节点可以连接到自己,false 表示自身节点对其它节点不可见,别的节点无法连接到自己 |
| outbounds | Integer | 扇出数,表示对外连接的节点个数 |
| inbounds | Integer | 扇入数,表示有多少外部节点连接本节点 |
**代码示例**
```java
//同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
//查询节点状态信息。
NetResult netResult = client.getNetInfo();
```
**返回值示例**
```json
{
"externalAddr": "192.168.0.114:13802",
"localAddr": "192.168.0.114:13802",
"service": false,
"outbounds": 0,
"inbounds": 0
}
```
# getPeerInfo
最近更新时间:2021-08-12 10:17:47
调用getPeerInfo接口查询节点列表信息。
**函数原型**
```Java
public List<PeerResult> getPeerInfo()
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | ------------ | ---------- | -------- |
| | | | | |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | ---------------- | ------------ | -------------------------------- |
| result | List< PeerResult > | 见返回值示例 | 远程节点列表信息, 参数详情见下表 |
**参数详情**
| 参数 | 类型 | 描述 |
| --------------------- | ------- | ------------------------ |
| **PeerResult对象** | | |
| addr | String | IP地址 |
| port | Integer | 监听端口 |
| name | String | 节点哈希 |
| mempoolSize | Integer | 交易缓存池中未打包交易数 |
| self | Boolean | 本地节点还是远端节点标志 |
| **BlockResult子对象** | | |
| version | Integer | 区块版本 |
| parentHash | String | 区块父哈希 |
| txHash | String | 默克尔根哈希 |
| stateHash | String | 状态哈希 |
| height | Long | 当前区块高度 |
| blockTime | Date | 区块时间戳 |
| txcount | Integer | 当前区块中交易数量 |
| hash | String | 当前区块哈希 |
**代码示例**
```java
//同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
//查询远程地址信息列表
List<PeerResult> peerResult = client.getPeerInfo();
```
**返回值示例**
```json
{
"peers": [
{
"addr": "192.168.0.114",
"port": 11590,
"name": "03f7a17df32744d088a7b4e1e7f8c46204e25f8ac5f3b5021f8a524bf1185e638c",
"mempoolSize": 0,
"self": true,
"header": {
"version": 0,
"parentHash": "0x325f9d433469ead86c69ab8563a0fd2bf8710f148286bf377e66e8c23c96696e",
"txHash": "0x58da4ae99a0f39210fb5092ac5ff88d71c27030788210cb7fdebbc400d762ec7",
"stateHash": "0xd882f039e3857e94219724aaccce330022d8e94d421f2338bb4e4b2f963f001d",
"height": 1022,
"blockTime": 1628595429,
"txCount": 1,
"hash": "0x958b7f6acbc6e9e1b5317fc37571c493457d5bcdd496f1c168a39f50aeaa6ca3",
"difficulty": 0
} } ]
}
```
# 查询自定义积分帐户
最近更新时间:2021-07-28 10:40:55
**函数原型**
```java
public List<AccountAccResult> getTokenBalance(List<String> addresses, String execer, String tokenSymbol)
```
**请求参数**
| **名称** | **类型** | **位置** | **是否必选** | **示例值** | **描述** |
| ----------- | -------- | -------- | ------------ | ---------- | ------------------------- |
| addresses | List | | 是 | | 账户地址列表。 |
| execer | String | | 是 | | 执行器名称,固定为token。 |
| tokenSymbol | String | | | | 积分名称。 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | -------------------- |
| result | List | | 自定义积分账户列表。 |
**代码示例**
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
List<String> addressList = new ArrayList<String>();
addressList.add("1EHWKLEixvfanTHWmnF7mYMuDDXT****");
addressList.add("1CbEVT9RnM5oZhWMj4fxUrJX94Vt****");
List<AccountAccResult> queryBalance;
queryBalance = client.getTokenBalance(addressList, "token", "COINSDEVX");
System.out.println(queryBalance);
\ No newline at end of file
# GetTxByHashes
最近更新时间:2021-07-27 15:43:13
调用GetTxByHashes接口根据hash数组批量查询交易列表信息。
**函数原型**
```java
public List<QueryTransactionResult> GetTxByHashes(List<String> hashIdList)
```
**请求参数**
| **名称** | **类型** | **位置** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | -------- | ------------ | ---------- | ------------ |
| hashList | List | | | | 交易哈希列表 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | ---------------------------- | ---------- | ------------------------ |
| result | List< QueryTransactionResult > | | 查询返回的交易结构体列表 |
**代码示例**
```java
// 同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
List<String> txHashs = new ArrayList<>();
txHashs.add("hash1");
txHashs.add("hash2");
// 根据txhas获取交易详情
List<QueryTransactionResult> txs = client.GetTxByHashes(txHashs);
for (int i = 0; i < txs.size(); i++) {
System.out.println(txs.get(i));
}
```
\ No newline at end of file
# getVersion
最近更新时间:2021-07-21 14:03:59
调用getVersion接口查询区块链版本信息。
**函数原型**
```java
public VersionResult getVersion()
```
**请求参数**
| 参数 | 必选 | 类型 | 说明 |
| ---- | ---- | ---- | ---- |
| - | - | - | - |
**返回字段**
| 返回字段 | 字段类型 | 说明 |
| -------- | ------------- | -------------- |
| result | VersionResult | 区块链版本信息 |
**参数详情**
| 参数 | 类型 | 描述 |
| ------------------------- | ------ | --------------- |
| **VersionResult****对象** | | |
| title | String | 区块链title |
| app | String | App版本号 |
| chain33 | String | Chain33链版本号 |
| localDB | String | localDB版本号 |
**代码示例**
```java
//同区块链建立rpc连接,IP地址替换成区块链某个节点真实IP
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
//获取远程地址信息列表
VersionResult result = client.getVersion();
```
**返回值示例**
```json
{
"result": {
"app": "1.65.2-55c88b1db89a09c42f8c32ce214667332f8ce624",
"localDb": "2.0.0",
"chain33": "1.65.2",
"title": "local"
},
"id": 2
}
```
\ No newline at end of file
# isSync
最近更新时间:2021-07-15 16:44:28
调用isSync接口查询节点的同步状态。
**函数原型**
```java
public Boolean isSync()
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | ------------ | ---------- | -------- |
| | | | | |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | --------------------------------------------------------- |
| result | Boolean | | 节点同步状态,取值如下:**true**:已同步**false**:未同步 |
**代码示例**
```java
//同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
//查询节点的同步状态。
Boolean result = client.isSync();
```
\ No newline at end of file
# Java SDK接入指南
最近更新时间:2021-12-20 18:01:32
您可以使用BAAS平台提供的Java SDK进行API调用。本文以数据如何明文上链、哈希上链和加密上链实例介绍如何使用Java SDK调用API。
**背景信息**
本文提供的示例Demo([点击下载 DemoSample.java 压缩包](https://bty33.oss-cn-shanghai.aliyuncs.com/chain33Dev/BAAS/DemoSample.zip))包含数据明文上链、哈希上链和加密上链功能。
示例Demo的程序执行流程如下:
1. 创建区块链公私钥和地址(createAccount();)。
2. 对存证数据做sha256哈希后上链(sha256Store();)。
3. 对存证数据做sm3哈希后上链(sm3Store();)。
4. 对存证数据做aes对称加密后上链(aesStore();)。
5. 对存证数据做sm4加密后上链(sm4Store();)。
**下载并安装SDK**
1. 下载最新版本的SDK压缩包。SDK版本信息和下载地址,请参见[SDK版本说明()](../devDocs/SdkVersion.md)
2. 解压SDK压缩包。
3. 将SDK压缩包中的JAR包安装到本地仓库。
在JAR包所在目录,执行以下命令:
mvn install:install-file -Dfile=chain33-sdk-java.jar -DgroupId=cn.chain33 -DartifactId=chain33-sdk-java -Dversion=1.0.14 -Dpackaging=jar
执行结果中打印**BUILD SUCCESS**,表明添加成功。
如果**time out**导致构建失败,可以再次执行以上命令,直至构建成功。
**使用Java SDK调用API**
1. 使用E
clipse或IntelliJ IDEA
创建一个基于
Maven
构建的工程。
- 工程中的
GroupId、ArtifactId、Version按如下要求设置:
| **参数** | **取值** |
| ---------- | -------------- |
| GroupId | com.chain33.cn |
| ArtifactId | sampleDemo |
| Version | 0.0.1-SNAPSHOT |
2.
pom.xml
中添加并导入如下依赖。
```Java
<dependencies>
<dependency>
<groupId>cn.chain33</groupId>
<artifactId>chain33-sdk-java</artifactId>
<version>1.0.14</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.10.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.bitcoinj</groupId>
<artifactId>bitcoinj-core</artifactId>
<version>0.14.7</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.67</version>
</dependency>
<dependency>
<groupId>net.vrallev.ecc</groupId>
<artifactId>ecc-25519-java</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.34.1</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
```
- 如果导入依赖缓慢,或出现**Connection timed out**的报错信息,则可能是因为默认中央仓库下载超时,可以切换成阿里云镜像重试。
```
<!—阿里云镜像 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
```
3. 在工程的**src > main > java**路径下新建一个名为**com.chain33.cn.sampleDemo**的Package。
4.**com.chain33.cn.sampleDemo**下新建一个名为**DemoSample**的Java类。
5. 将示例程序DemoSample.java解压并拷贝代码至**DemoSample**的Java类中。
6. 修改**RpcClient**中的“**区块链节点IP地址**”为真实的区块链节点公网IP地址, 然后运行程序。
- 在控制台打印以下信息,代表和区块链连接成功,并成功上链。
Create account success.
sha256 store success.
sm3 store success.
aes store success.
sm4 store success.
- 如果出现RPC错的情况,请确认区块链节点是否正常运行,且8801端口也已经正常对外开放。
**后续步骤**
程序正常执行后,您可以根据返回的hash值,在区块链浏览器上查询数据详情。
\ No newline at end of file
# 管理合约
最近更新时间:2021-07-27 16:58:43
每一条链都有一个超级管理员,通过这个超级管理员可以给其他帐户赋予权限,比如允许其它用户发行自定义积分,或是增删共识节点等操作,此类操作都由管理合约来执行。
区块链管理合约包含三个动作:1. 构造区块链管理合约交易;2. 签名这笔交易;3.将这笔交易发送至区块链上。 其中1和2由createManage函数完成, 3由submitTransaction(见4.1)完成
上链结果查询由queryTransaction(见4.2)完成
**函数原型**
```java
public static String createManage(String key, String value, String op, String privateKey, String execer)
```
请求参数
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| ---------- | -------- | ------------ | ---------- | ------------------------------------------------------------ |
| key | String | 是 | | 对应不同的权限值。token-blacklist :积分黑名单token-finisher :积分审核者qbft-manager::增删共识节点管理者 |
| value | String | 是 | | 用户区块链地址。 |
| op | String | 是 | | 操作符,如add、del等。 |
| privateKey | String | 是 | | 超级管理员私钥,对应BAAS平台上链地址管理中的私钥。 |
| execer | String | 是 | | 执行器名称:manage。 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | -------------------- |
| result | String | | 构造并签好名的交易。 |
**代码示例**
- 积分黑名单示例
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 管理合约名称。
String execerName = "manage";
// 管理合约:配置黑名单KEY。
String key = "token-blacklist";
// 管理合约:配置黑名单VALUE。
String value = "BTC";
// 管理合约:配置操作符。
String op = "add";
// TODO:当前链管理员私钥(superManager),需要替换成链真实管理员私钥
String privateKey = "管理员私钥";
// 构造并签名交易,使用链的管理员(superManager)进行签名。
String txEncode = TransactionUtil.createManage(key, value, op, privateKey, execerName);
String hash = client.submitTransaction(txEncode);
System.out.println(hash);
Thread.sleep(2000);
// 根据上链返回的hash查询上链交易是否执行成功,区块链执行是一个异步的过程,调用上链接口会实时返回hash,但此时还未上链成功,真正能查到数据后才是上链成功。
QueryTransactionResult queryTransaction = client.queryTransaction(hash);
if (null != queryTransaction) {
int result = queryTransaction.getReceipt().getTy();
if(result == 2) {
System.out.println("管理合约执行成功");
}
}
```
- 积分审核者示例
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 管理合约名称。
String execerName = "manage";
// 管理合约:配置KEY。
String key = "token-finisher";
// 管理合约:配置VALUE,用于审核token的创建。
String value = "1M8gvr1DZ1KKVjf6XW6aYR6pHGeDRspdCx";
// 管理合约:配置操作符。
String op = "add";
// 当前链管理员私钥(superManager)。
String privateKey = "管理员私钥";
// 构造并签名交易,使用链的管理员(superManager)进行签名。
String txEncode = TransactionUtil.createManage(key, value, op, privateKey, execerName);
String hash = client.submitTransaction(txEncode);
System.out.println(hash);
Thread.sleep(2000);
// 根据上链返回的hash查询上链交易是否执行成功,区块链执行是一个异步的过程,调用上链接口会实时返回hash,但此时还未上链成功,真正能查到数据后才是上链成功。
QueryTransactionResult queryTransaction = client.queryTransaction(hash);
if (null != queryTransaction) {
int result = queryTransaction.getReceipt().getTy();
if(result == 2) {
​ System.out.println("管理合约执行成功");
}
}
```
\ No newline at end of file
# 自定义积分合约
最近更新时间:2021-07-27 18:14:39
用户在区块链上可以发行自定义的积分,可以指定积分名称和数量。
自定义积分发行需要经过以下几步:
1. 通过当前链的管理员来配置自定义积分的黑名单(全局配置:通常情况下只需要执行一次)。
2. 通过当前链的超级管理员来配置自定义积分的审核者(全局配置:通常情况下只需要执行一次)。
3. 通过积分审核者来预发行自定义积分。
4. 通过积分审核者来正式发行自定义积分。
自定义积分的黑名单和审核者配置方式,请参见[创建管理权限](../devDocs/ManageContract.md)
自定义积分合约包含以下5个接口:
- 积分预发行
- 积分正式发行
- 转让自定义积分
- 查询已创建的自定义积分
- 查询自定义积分帐户
\ No newline at end of file
# 数字资产NFT溯源示例
最近更新时间:2021-08-26 18:17:28
下面基于ERC1155标准,在chain33上实现NFT的发行,流转。以及在NFT流转过程中,可添加溯源信息,同时可以根据NFT的tokenId查到这个NFT的溯源信息内容。
*注意:本文中示例只提供思路,如果要用于生产环境,需要结合实际业务场景进行扩充*
**背景**
NFT(非同质化数字资产)是具有唯一且彼此不可替换属性的数字资产,具有标准化、通用性、流动性以及可编程特性,常见的应用场景包括收藏品、游戏物品、数字艺术、证书、域名等。NFT不像BTC或ETH这些可以分割成0.1或是0.02,NFT的单位永远是1,唯一性和稀缺性是它的典型特征。
NFT因为2017年的以太猫而大火,同时开创了第一个NFT的标准:ERC721。 之后又由Enjin公司在ERC721的基础上制订了ERC1155的标准,它支持在一个合约中存储多个数字资产,支持一次性批量发行多个不同类型的的数字资产,支持在一次转账过程中转多个不同类型的数字资产。
Chain33的EVM虚拟机也完全兼容上述的NFT标准,下面就以一个NFT资产的发行,溯源的例子,来看看如何在Chain33上实现NFT合约。
**场景设计**
假设对敦煌飞天壁画批量发行500个NFT资产, 每一个资产都可以在区块链上流转并且流转中都要有过程记录的文字描述。 通过用户地址可以查看每个资产的持有数量;通过资产的ID可以查询这个资产的流转过程的文字描述。
**合约设计**
1. 支持批量发行NFT的合约接口,用户可传入NFT的编号列表,每个NFT的数量列表来批量发行NFT,同时合约限定只有合约部署者才可以发行资产。
2. 支持NFT的转让的合约接口,用户可传入转让的去向地址,NFT编号,转让数量,转让过程描述来转让NFT
3. 支持根据NFT的编号溯源NFT的转让过程
4. 支持根据用户地址查询NFT资产
**智能合约代码**
```solidity
pragma solidity ^0.8.0;
import "github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol";
contract ArtTokens is ERC1155 {
string optStr = "-->";
string leftOpt = "(";
string rightOpt = ")";
address public _owner;
*//* *艺术品追踪信息*
mapping(string => string) private _artsInfo;
constructor() public ERC1155("") {
​ _owner = msg.sender;
}
*/***
*** *初始化**NFT**资产*
** ids: NFT**资产数组*
** amounts: NFT**数额,和上面的**ids**长度要保持一致,并且一一对应*
**/*
function initArtNFT(uint256[] memory ids, uint256[] memory amounts) external {
​ require(msg.sender == _owner, "only authorized owner can store files.");
​ _mintBatch(msg.sender, ids, amounts, "");
}
*/***
*** *转让**NFT*
** to:* *转让的去向地址*
** id: NFT**编号*
** amount:* *转让数量*
** traceInfo:* *转让过程描述*
**/*
function transferArtNFT(address to, uint256 id, uint256 amount, string memory traceInfo) external {
​ *//* *转账*
​ safeTransferFrom(msg.sender, to, id, amount, "");
​ string memory artIndex = uint2str(id);
​ *//* *填入转账附言(溯源记录)*
​ string memory tinfo = _artsInfo[artIndex];
​ string memory info1 = stringAppend(tinfo, optStr);
​ string memory info2 = stringAppend(info1, leftOpt);
​ string memory info3 = stringAppend(info2, traceInfo);
​ string memory info4 = stringAppend(info3, rightOpt);
​ _artsInfo[artIndex] = info4;
}
*/***
*** *根据**NFT**的**ID**获取溯源信息*
**/*
function getNFTTrace(string memory id) public view returns (string memory){
​ return _artsInfo[id];
}
function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
​ if (_i == 0) {
​ return "0";
​ }
​ uint j = _i;
​ uint len;
​ while (j != 0) {
​ len++;
​ j /= 10;
​ }
​ bytes memory bstr = new bytes(len);
​ uint k = len;
​ while (_i != 0) {
​ k = k-1;
​ uint8 temp = (48 + uint8(_i - _i / 10 * 10));
​ bytes1 b1 = bytes1(temp);
​ bstr[k] = b1;
​ _i /= 10;
​ }
​ return string(bstr);
}
function stringAppend(string memory a, string memory b) private pure returns(string memory){
​ bytes memory _a = bytes(a);
​ bytes memory _b = bytes(b);
​ bytes memory res = new bytes(_a.length + _b.length);
​ for(uint i = 0;i < _a.length;i++) {
​ res[i] = _a[i];
​ }
​ for(uint j = 0;j < _b.length;j++) {
​ res[_a.length+j] = _b[j];
​ }
​ return string(res);
}
}
```
**合约部署及调用流程**
1. 编译上述智能合约,获取到ABI和bytecode
2. 通过SDK将上述智能合约部署到链上
3. 调用initArtNFT方法,初始化一批NFT数字资产
4. 多次调用transferArtNFT方法,将某一个NFT资产从Owner转给用户A,用户B,用户C
5. 根据用户地址查询用户A,B,C下的资产数
6. 根据NFT资产ID查询溯源过程
注:在部署合约和调用合约时,都需要gas费这个参数,SDK中提供了查询当前交易消耗gas费的方法。 但我们实际应用的开发对接中,并不建议在程序中每调用一次合约前都调一次查询gas费的接口,因为这个查询的本质是在区块链上做交易的预执行,当合约比较复杂或是合约里有大量的循环,会导致查询时间非常长。 以上面的例子为例,当批量发行8000个NFT时,查询gas费的时间超过了1分钟。 所以建议做法是事先通过查询方法来评估gas费用,实际调用时直接传评估好的值。
\ No newline at end of file
# newAccountLocal
最近更新时间:2021-07-27 15:58:25
调用newAccountLocal接口用于生成私钥,公钥,地址等信息。
**函数原型**
```java
public AccountInfo newAccountLocal()
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | ------------ | ---------- | -------- |
| | | | | |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | ----------- | ---------- | -------------- |
| result | AccountInfo | | 区块链账户信息 |
**代码示例**
```java
Account account = new Account();
// 获取区块链私钥,公钥,地址。
AccountInfo accountInfo = account.newAccountLocal();
```
\ No newline at end of file
# 积分正式发行
最近更新时间:2021-07-28 10:16:44
积分正式发行合约包含三个动作:1. 构造区块链积分正式发行交易;2. 签名这笔交易;3.将这笔交易发送至区块链上。 其中1和2由createTokenFinishTx函数完成, 3由submitTransaction(见4.1)完成
上链结果查询由queryTransaction(见4.2)完成
函数原型
```java
public static String createTokenFinishTx(String symbol, String execer, String ownerAddr, String managerPrivateKey)
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| ----------------- | -------- | ------------ | ---------- | -------------------------------- |
| symbol | String | 是 | | 积分名称,支持大小写字母和数字。 |
| execer | String | 是 | | 执行器名称,联盟链固定为token。 |
| ownerAddr | String | 是 | | 积分地址拥有者。 |
| managerPrivateKey | String | 是 | | 交易发起者的私钥(审核者)。 |
返回参数
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | ---------------------- |
| result | String | | 构造并签好名的交易体。 |
**代码示例**
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("localhost", 8801);
//积分名称,支持大小写字母和数字。
String symbol = "COINSDEVX";
//执行器名称,联盟链固定为token。
String execer = "token";
//交易发起者的私钥(审核者)。
String managerPrivateKey = "审核者的私钥";
//积分地址拥有者。
String owner = "1EHWKLEixvfanTHWmnF7mYMuDDXT****";
String hexData = TransactionUtil.createTokenFinishTx(symbol, execer, owner, managerPrivateKey);
String hash = client.submitTransaction(hexData);
System.out.println(hash);
Thread.sleep(2000);
// 根据上链返回的hash查询上链交易是否执行成功。
//区块链执行是一个异步的过程,调用上链接口会实时返回hash,但此时还未上链成功,真正能查到数据后才是上链成功。
QueryTransactionResult queryTransaction = client.queryTransaction(hash);
if (null != queryTransaction) {
int result = queryTransaction.getReceipt().getTy();
if(result == 2) {
​ System.out.println("积分正式创建合约执行成功");
}
}
```
\ No newline at end of file
# 积分预发行
最近更新时间:2021-07-28 10:44:37
积分预发行合约包含三个动作:1. 构造区块链预发行交易;2. 签名这笔交易;3.将这笔交易发送至区块链上。 其中1和2由transferBalanceMain函数完成, 3由submitTransaction(见4.1)完成
上链结果查询由queryTransaction(见4.2)完成
函数原型
```java
public static String createPrecreateTokenTx(String execer, String name, String symbol, String introduction,Long total, Long price, String owner, Integer category, String privateKey)
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| ------------ | -------- | ------------ | ---------- | ------------------------------------------------------------ |
| execer | String | 是 | | 执行器名称,联盟链固定为token。 |
| name | String | 是 | | 积分别名。 |
| symbol | String | 是 | | 积分名称,支持设置为大小写字母和数字。 |
| introduction | String | 是 | | 积分介绍,限制在200字以内。 |
| total | String | 是 | | 积分发行总量,需要乘以10的8次方,比如要发行100个币,需要100*1e8。 |
| price | String | 是 | | 发行该token愿意承担的费用,设置为0即可。 |
| owner | String | 是 | | 积分拥有者的地址。 |
| category | String | 是 | | token属性类别。 0 :普通token 1 :可增发和燃烧 |
| privateKey | String | 是 | | 交易发起者的私钥。 |
返回参数
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | -------------------------- |
| result | String | | 构造并签好名的交易结构体。 |
**代码示例**
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("localhost", 8801);
//token总额。
long total = 19900000000000000L;
//token的注释名称。
String name = "DEVELOP COINS";
//token的名称,只支持大写字母和数字组合,同一条链不允许相同symbol存在。
String symbol = "COINSDEVX";
//token介绍,限制200字以内。
String introduction = "开发者积分";
//发行token愿意承担的费用,设置为0即可。
Long price = 0L;
//token属性类别。0为普通token, 1可增发和燃烧。
Integer category = 0;
//合约名称。
String execer = "token";
//token的拥有者地址。
String owner = "1EHWKLEixvfanTHWmnF7mYMuDDX****";
//预创建人的私钥。
String privateKey = "预创建人的私钥";
String precreateTx = TransactionUtil.createPrecreateTokenTx(execer, name, symbol, introduction, total, price,
​ owner, category, privateKey);
String hash = client.submitTransaction(precreateTx);
System.out.println(hash);
Thread.sleep(2000);
// 根据上链返回的hash查询上链交易是否执行成功。
//区块链执行是一个异步的过程,调用上链接口会实时返回hash,但此时还未上链成功,真正能查到数据后才是上链成功。
QueryTransactionResult queryTransaction = client.queryTransaction(hash);
if (null != queryTransaction) {
int result = queryTransaction.getReceipt().getTy();
if(result == 2) {
​ System.out.println("积分预创建合约执行成功");
}
}
```
\ No newline at end of file
# 查询帐户余额
最近更新时间:2021-07-27 17:38:16
**函数原型**
```java
public List<AccountAccResult> getCoinsBalance(List<String> addresses, String execer)
```
**请求参数**
| 名称 | 类型 | 是否必选 | 示例值 | 描述 |
| --------- | ------ | -------- | ------ | ------------------------------------------- |
| addresses | List | 是 | | 地址列表。 |
| execer | String | 是 | | 执行器名称:主链主积分情况下,默认为coins。 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | ----------------------- | ---------- | -------------- |
| result | List< AccountAccResult> | | 帐户结果列表。 |
**参数详情**
| 参数 | 类型 | 描述 |
| -------------------------------- | ------- | ---------- |
| **AccountAccResult****对****象** | | |
| currency | Integer | 金额 |
| balance | Long | 余额 |
| frozen | Long | 冻结金额 |
| addr | String | 区块链地址 |
**代码示例**
```java
// 同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
List<String> list = new ArrayList<String>();
list.add("1CbEVT9RnM5oZhWMj4fxUrJX94VtR****");
list.add("1EHWKLEixvfanTHWmnF7mYMuuDDXT****");
List<AccountAccResult> queryBtyBalance;
queryBtyBalance = client.getCoinsBalance(list, "coins");
if (queryBtyBalance != null) {
for (AccountAccResult accountAccResult : queryBtyBalance) {
System.out.println(accountAccResult);
}
```
\ No newline at end of file
# 查询已创建的自定义积分
最近更新时间:2021-07-28 10:34:38
**函数原型**
```java
public List<TokenResult> queryCreateTokens(Integer status,String execer)
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | ------------ | ---------- | -------------------------------- |
| status | Integer | 是 | | 积分状态。0:预创建的1:创建成功 |
| execer | String | 是 | | 执行器名称,固定为token。 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | -------------------- |
| result | List | | 自定义积分结果列表。 |
**代码示例**
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
String execer = "token";
//积分状态,0表示预创建的;1表示创建成功的。
Integer status = 1;
List<TokenResult> queryCreateTokens = client.queryCreateTokens(status,execer);
System.out.println(queryCreateTokens);
\ No newline at end of file
# 预估Gas费用
最近更新时间:2021-08-30 16:32:52
### 通过queryEVMGas,估算gas费用, 实际应用过程中,不建议在代码中调用gas费, 因为这一步可能因为合约的复杂而消耗比较长的时间,复杂的合约可以先通过此方法预估gas费
函数原型
```java
public long queryEVMGas(String execer, String tx, String address)
```
**请求参数**
| **参数** | **必选** | **类型** | **说明** |
| -------- | -------- | -------- | ------------------ |
| execer | 是 | String | 合约名称:“evm” |
| tx | 是 | String | 未签名的交易hex |
| address | 是 | Byte[] | 调用者的区块链地址 |
返回字段
| **返回字段** | **字段类型** | **说明** |
| ------------ | ------------ | --------------- |
| gas | long | 估算出来的gas值 |
**代码示例**
```java
// TODO:同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
String codes = "solidity编译出来的字节码";
String abi = "solidity编译出来的abi code";
byte[] code = ByteUtil.merge(HexUtil.fromHexString(codes), abi.getBytes());
// 获取未签名的交易hex
String evmCode = EvmUtil.getCreateEvmEncode(code, "", "evm-sdk-test", "");
// TODO:实际应用过程中,不建议在代码中调用gas费, 因为这一步可能因为合约的复杂而消耗比较长的时间
long gas = client.queryEVMGas("evm", evmCode, address);
\ No newline at end of file
# queryTransaction
最近更新时间:2021-07-27 15:39:26
调用queryTransaction接口根据hash值查询交易信息。
**函数原型**
```java
public QueryTransactionResult queryTransaction(String hash)
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| -------- | -------- | ------------ | ---------- | ---------- |
| hash | String | | | 交易哈希。 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | ---------------------- | ---------- | ---------------------- |
| result | QueryTransactionResult | | 查询返回的交易结构体。 |
**参数详情**
| 参数 | 类型 | 描述 |
| -------------------------------------- | ------------- | -------------------------- |
| **QueryTransactionResult****对****象** | | |
| amount | Long | 金额 |
| blocktime | Date | 区块时间 |
| index | Integer | 交易在区块中的index |
| actionname | String | 合约方法名称 |
| fromaddr | String | 来源地址 |
| height | Long | 区块高度 |
| receipt | Receipt | 交易执行结果 |
| **TransactionResult****子对象** | | |
| payload | PayLoadResult | 交易中的原始负载 |
| execer | String | 合约名称 |
| rawpayload | String | 原始负载的编码 |
| expire | long | 交易过期时间 |
| nonce | long | 交易识别码(用于防止重复) |
| to | String | 目标地址 |
| signature | Signature | 交易签名信息 |
**代码示例**
```java
// 同区块链建立RPC连接,IP地址替换成区块链某个节点真实IP。
RpcClient client = new RpcClient("区块链节点IP地址", 8801);
// 根据hash值查询交易信息。
QueryTransactionResult queryTransaction = client.queryTransaction("交易哈希");
```
**返回值示例**
```json
{
"id": 2,
"result": {
"tx": {
"execer": "user.p.mbaas.user.write",
"payload": {
"topic": "",
"content": "{\"档案编号\":\"ID0000001\",\"企业代码\":\"QY0000001\",\"业务标识\":\"DA000001\",\"来源系统\":\"OA\", \"文档摘要\",\"0x93689a705ac0bb4612824883060d73d02534f8ba758f5ca21a343beab2bf7b47\"}"
},
"rawPayload": "0x7b22e6a1a3e6a188e7bc96e58fb7223a22494430303030303031222c22e4bc81e4b89ae4bba3e7a081223a22515930303030303031222c22e4b89ae58aa1e6a087e8af86223a224441303030303031222c22e69da5e6ba90e7b3bbe7bb9f223a224f41222c2022e69687e6a1a3e69198e8a681222c22307839333638396137303561633062623436313238323438383330363064373364303235333466386261373538663563613231613334336265616232626637623437227d",
"signature": {
"ty": 1,
"pubkey": "0x03cebb716f4fd1696891947c56d9c6942e88e9e97cd9c6d2369cdc2140941fb113",
"signature": "0x3045022100907f187fe40ff01e9973c862f470649ec860f27dee3673ffe7ab17841cdac5a50220309b5990fcc913e84915a0ddd244b20075cb7596e9e4a0f309a56fc3032d670a"
},
"fee": 1000000,
"feefmt": "0.0100",
"expire": 0,
"nonce": 3641719660513651574,
"from": "1M8gvr1DZ1KKVjf6XW6aYR6pHGeDRspdCx",
"to": "1Ao1qW9vKDXbSAu89q3KmzDAFh8srzDBCo",
"hash": "0x0521424121b690e81fbec937484ee59a99e9494e308d9ae8fbabae0dfdf4907d"
},
"receipt": {
"ty": 1,
"tyName": "ExecPack",
"logs": null
},
"proofs": null,
"height": 87,
"index": 0,
"blockTime": 1630478768,
"amount": 0,
"fromAddr": "1M8gvr1DZ1KKVjf6XW6aYR6pHGeDRspdCx",
"actionName": "unknown",
"assets": null,
"txProofs": [{
"proofs": ["0x545f90e858e02e1a5c55a40a3cdaadcae9c8ebf551c2e143d14143414de628d3", "0x4f635fc8e99690b7d71df9e13f2ef045e1ce32ae218404977c8212b52f98d28d", "0x75d51729c16c1564d0231ff8b323f2379f1c23359e783329440242f636c68416", "0x7d5dc815dfa02cd50b9f6661d3d140219f3c1b9efe29953c0c3aa2603c6ee12a", "0x5316a4f6b8334cdc4e2bedb27ce6abb29da5ba4db82139faef552d620064ebf4", "0x55e5444177100fdd39534335b7276ec86ebcc9b5d890719afc1261bf42020d89", "0x0ae14fb4e7d2200d44b6517f0cdf2491d044813c692f3d081ee95800679ade94"],
"index": 0,
"rootHash": ""
}],
"fullHash": "0xa9e3e589e93a076d3b5acf24bc457e0589ffc243806f35ff4987476f57bb2089"
},
"error": null
}
```
\ No newline at end of file
# SDK版本说明
最近更新时间:2021-08-10 20:14:22
Chain33的Java SDK提供交易构造、交易签名、数据加密、发送交易、查询交易、区块链查询等能力,以便于应用层更容易的接入区块链。
| **版本号** | **功能** | **链大版本号** | **Commit hash** | **下载链接** |
| ---------- | ------------------------------------------------------------ | -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 1.0.13 | 支持查询区块链信息,如区块高度、交易、节点信息、同步状态。支持部署EVM和WASM合智能合约,并调用。支持JSON-RPC和gRPC调用。兼容国密标准SM2、SM3和SM4。支持原生存证、积分发行和转账等能力。 | V1.65 | [37ca55e](https://github.com/33cn/plugin/commit/37ca55e61e73f977fb4dce1ee3208fe4e4344899) | [点击下载SDK](https://github.com/33cn/chain33-sdk-java/releases/download/1.0.13/chain33-sdk-java-1.0.13.zip) |
| 1.0.14 | 在上一版本基础上增加离线生成助记词功能助记词推导出公私钥适配chain33地址针对EVM合约升级,SDK适配EVM新接口 | V1.65 | | [点击下载SDK](https://github.com/33cn/chain33-sdk-java/releases/download/1.0.14/chain33-sdk-java-1.0.14.zip) |
| 1.0.15 | 在上一版本基础上增加 增加EVM合约gas费估算接口部署和调用EVM合约接口增加gas费参增加ERC1155合约用例 | V1.65 | [0670237](https://github.com/33cn/plugin/commit/0670237f6c7139fd9e33cbc05ecba146cde18f67) | [点击下载SDK](https://github.com/33cn/chain33-sdk-java/releases/download/1.0.15/chain33-sdk-java-1.0.15.zip) |
\ No newline at end of file
# sha256
最近更新时间:2021-07-27 15:46:45
调用sha256接口对上链内容做哈希运算。
**函数原型**
```java
public static byte[] Sha256(byte[] sourceByte)
```
**请求参数**
| **名称** | **类型** | **是否必选** | **示例值** | **描述** |
| ---------- | -------- | ------------ | ---------- | ------------------------ |
| sourceByte | byte[] | 是 | | 存证内容的byte数组类型。 |
**返回参数**
| **参数** | **类型** | **示例值** | **描述** |
| -------- | -------- | ---------- | ---------------------- |
| result | byte[] | | 哈希运算后的byte数组。 |
**代码示例**
```java
//存证内容。
String content = "{"存证内容":"sha256存证","存证时间":"20210719"}";
//对存证内容做sha256运算。
byte[] contentHash = TransactionUtil.Sha256(content.getBytes());
```
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment