环境准备¶
运行环境
安装Java:JDK 14 (JDK1.8 至JDK 14都支持)
搭建一条FISCO BCOS链
请参考FISCO BCOS安装搭建。
准备demo¶
下载源码¶
git clone https://github.com/WeBankBlockchain/OpenLedger
打开demo/build
目录
修改sdk.toml
中节点的IP和端口,与您要连接的节点所匹配。
拷贝证书¶
从节点nodes/${ip}/Service/
目录下的证书拷贝到conf
目录。
修改项目配置文件¶
修改application.properties
文件中blockchain.txKey
为conf
目录下的账户私钥文件
示例:
blockchain.txKey=0x11a070299af8ec007927188f91d40759d1a7c525.pem
体验demo¶
启动¶
控制台执行以下命令:
java -jar openledger-demo-1.0.0-all.jar
启动完成后出现以下提示:
Welcome to OpenLedger! please input 'init' to run a new project or 'help' to learn more,input 'quit' to exist.
OpenLedger-demo>
项目管理¶
初始化项目¶
输入init
初始化项目。
初始化成功后,控制台输出相关合约地址以及组织管理员地址与私钥,其中初始化完成后,程序默认登录组织管理员。
project.addr:0x809185526e71a2cee6890185452cff883959434a
accountmanager.addr:0x44c064808dee8143dccd7d7560c1e92d8976980a
authmanager.addr:0xf95bad61af99e88f0ce3c6ac62cb25c9cd6f151d
authcenter.addr:0xe7dc3226d54b384c3e5f00a7b40ad62bdf800e09
org.addr:0xeedf3702b47144f512b454ad230aa68be1f5a842
orgAdmin.addr(logon):0xda86d395c99a846db5f76d6339fdde12415d75a2
orgAdmin.prikey:c0a82314219cc7951e76e8cd1b910c16ee87cb5892383da4b0a91c98c080b68f
create Project:0x809185526e71a2cee6890185452cff883959434a
加载项目¶
demo的运行需要先加载项目,初始化后默认加载创建的项目,同时支持通过配置文件的方式加载项目。
将project.addr
、accountmanager.addr
、authmanager.addr
、authcenter.addr
、org.addr
配置到application.propertis
。
例如:
project.addr:0x8b72183b20975c115a3e4335ceb668ed70828756
accountmanager.addr:0x270bf532e2be56a64b85a0ae81fdd4930d9e97cf
authmanager.addr:0xc32b2c8a3172462d895b4d7f5ff9223489d40c7b
authcenter.addr:0xe7846a2cc4ff9c3cd15294fae746a8d8ee8b73c3
org.addr:0xc0d82fd05ea37d473f4cc2a364ffdcc555bbfc6c
执行命令加载:
OpenLedger-demo>load
执行完成后输出:
load Project:0x8b72183b20975c115a3e4335ceb668ed70828756
账户管理¶
登录账户¶
账户通过私钥登录到demo,作为后续交易签名方。
控制台执行login
命令登录:
OpenLedger-demo>login 99cdcc7bb81573229a6d0365c53c3cafa869fb067c87bace262f23685205b04d
99cdcc7bb81573229a6d0365c53c3cafa869fb067c87bace262f23685205b04d
为私钥。
查看当前登录账户¶
OpenLedger-demo>whoami
生成公私钥对¶
OpenLedger-demo>generateAccount
返回地址以及公钥:
address:0x50b5d4ee132159d4ba7029bce866b4131f3658d1
prikey:5c6b07518d24cb89d03e4cb83a7097afee3488c7bf5892a41d81db5c7a031f43
创建组织账户¶
需要登录组织管理员创建组织账户。
执行createAccount $accountAddress
命令创建账户($accountAddress
为账户地址):
eg:
OpenLedger-demo>createAccount 0x70b5d4ee132159d4ba7029bce866b4131f3658d1
0x70b5d4ee132159d4ba7029bce866b4131f3658d1
为账户地址,可通过generateAccount
生成。
冻结组织账户¶
需要登录组织管理员冻结组织账户。
执行freeze $accountAddress
命令创建账户($accountAddress
为账户地址):
eg:
OpenLedger-demo>freeze 0x70b5d4ee132159d4ba7029bce866b4131f3658d1
0x70b5d4ee132159d4ba7029bce866b4131f3658d1
为账户地址。
解冻组织账户¶
需要登录组织管理员解冻组织账户。
执行unfreeze $accountAddress
命令创建账户($accountAddress
为账户地址):
eg:
OpenLedger-demo>unfreeze 0x70b5d4ee132159d4ba7029bce866b4131f3658d1
0x70b5d4ee132159d4ba7029bce866b4131f3658d1
为账户地址。
注销组织账户¶
需要登录组织管理员解注销组织账户。
执行cancel $accountAddress
命令创建账户($accountAddress
为账户地址):
eg:
OpenLedger-demo>cancel 0x70b5d4ee132159d4ba7029bce866b4131f3658d1
0x70b5d4ee132159d4ba7029bce866b4131f3658d1
为账户地址。
替换组织账户外部地址¶
需要登录组织管理员替换组织账户外部地址
执行changeExternalAccount $accountAddress
命令创建账户($accountAddress
为账户地址):
eg:
OpenLedger-demo>changeExternalAccount 0x70b5d4ee132159d4ba7029bce866b4131f3658d1
0x70b5d4ee132159d4ba7029bce866b4131f3658d1
为账户地址。
账本管理¶
创建账本¶
需要登录组织管理员操作。
创建资产命令:createAsset $isFungible $assetName
isFungible
:true
为同质化,false
为非同质化。assetName
: 账本名称自定义。
执行完成后返回账本地址。
eg:
创建登记资产数量变化模式的账本
OpenLedger-demo>createAsset true fungible1
创建登记权益所有权变更模式的账本
OpenLedger-demo>createAsset false nonfungible1
加载账本¶
demo支持通过账本地址加载账本,创建账本后默认加载新创建的账本,加载账本后才能执行账本的所有操作。
命令:
loadAsset $assetAddr $isFungible
assetAddr
: 账本合约地址,可通过创建账本获取。isFungible
: 是否为同质化资产,true
为同质化,false
为非同质化。
eg:
OpenLedger-demo>loadAsset 0x70b3d4ee132159d4ba7029bce866b4131f3658d1 false
登记账户¶
需要登录组织管理员操作账本登记账户。
命令:
openAccount $accountAddr
accountAddr
: 账户地址。
eg:
OpenLedger-demo>openAccount 0x70b3d4ee132159d4ba7029bce866b4131f3658d2
余额数量变化账目管理¶
登记资产存入账目¶
需要登录组织管理员操作登记存入。
命令:
deposit $accountAddr $amount
accountAddr:
已登记的账户地址。amount:
存入数量。
eg:
OpenLedger-demo>deposit 0x70b3d4ee132159d4ba7029bce866b4131f3658d2 100
返回:
deposit successfully! transaction result:TransferResult{isSuccees=true, termNo=1, seqNo=3}
TransferResult
说明 :
termNo
: 账期seqNo
: 交易序列号
登记资产提取账目¶
需要登录组织管理员操作提取记账。
命令:
withdrawal $accountAddr $amount
accountAddr:
已登记的账户地址。amount:
提取数量。
eg:
OpenLedger-demo>withdrawal 0x70b3d4ee132159d4ba7029bce866b4131f3658d2 100
返回:
withdrawal successfully! transaction result:TransferResult{isSuccees=true, termNo=1, seqNo=3}
TransferResult
说明 :
termNo
: 账期seqNo
: 交易序列号
登记资产数量转移账目¶
账户仅有操作自己资产余额的权限。
生成签名¶
交易前需要使用交易转出方(from)私钥进行签名。
切换登录账户,使用当前登录账户生成签名
OpenLedger-demo>login $fromAddress
生成签名
OpenLedger-demo>generateTransferSign $from $to $amount
返回签名字符串。
使用签名交易¶
命令:
transfer $from $to $amount $sign
from
: 转出方账户地址。to
: 接收方账户地址。amount
: 交易数量。sign
: 通过上面生成签名操作的结果。
(上面1,2步骤可分离操作实现授权代理场景,即A客户端使用拥有者执行生成签名,把签名复制到B客户端使用组织管理员执行交易)
返回:
transfer successfully! transaction result:TransferResult{isSuccees=true, termNo=1, seqNo=128}
isSuccees
: 操作是否成功,成功则为true,失败则为false。termNo
: 台账账期号。seqNo
: 交易序列号。
例子:
A端为拥有者账户:
OpenLedger-demo>login $clientPrikey ## 登录拥有者账户
logon $clientAddr
OpenLedger-demo>generateTransferSign $from $to $amount ## from等于clientAddr
result:xxx ## 生成签名
OpenLedger-demo>transfer $from $to $amount $resultSign ##拥有者自己执行交易
B端为组织管理员:
resultSign
为A端生成签名结果
OpenLedger-demo>login $adminPrikey ## 登录组织管理员
OpenLedger-demo>transfer $from $to $amount $resultSign ##resultSign 为A端产生签名
eg:
OpenLedger-demo>transfer 0xd1d99b85b912ffcfbe266ac317c6b88a3b06530b 0x3fe7b33c513555aa9f5b25e1e0f2c51da97e02ba 100 127918723897129878937223243242
余额查询¶
账户可通过提交签名查询自己资产的余额。
1.使用当前登录账户生成签名
OpenLedger-demo>generateQuerySign
返回签名字符串。
2.执行查询余额命令
命令:
getBalance $accountAddr $sign
accountAddr
: 账户地址。sign
: 签名。
(上面1,2步骤可分离操作实现授权代理场景,即A客户端使用资产拥有者执行生成签名,把签名复制到B客户端使用组织管理员执行查询余额)
例子:
A端为资产拥有者账户:
OpenLedger-demo>login $clientPrikey ## 登录资产拥有者账户
logon $clientAddr
OpenLedger-demo>generateQuerySign
result:xxx ## 生成签名
OpenLedger-demo>getBalance $clientAddr resultSign ##拥有者查询自己余额
result:100
B端为组织管理员:
resultSign
为A端生成签名结果
OpenLedger-demo>login $adminPrikey ## 登录组织管理员
OpenLedger-demo>getBalance $clientAddr resultSign ## 管理员执行查询client余额
result:100
权益所有权变更账目管理¶
权益定义¶
执行发行前调用loadAsset
加载账本,该操作仅支持管理员。
命令:
issue $issuerAddr $num $noteNoPrefix $noteNoSize $expirationDate
issuer
: 定义方地址,必须已开户账户。num
: 权益数量,如100。noteNoPrefix:
权益编码前缀,如2021。noteNoSize
: 权益编码除了前缀外的长度,如4,起始编码则为20210001。expirationDate
: 权益过期时间,日期格式为0000-00-00
eg:
OpenLedger-demo>issue 0xd1d99b85b912ffcfbe266ac317c6b88a3b06530b 100 2021 4 2023-10-01
返回:
issue successfully! issue noteNos:[IssueNoteResult{batchNo=1,noteNo=20210001, termNo=1, SeqNo=25}]
noteNos
: 返回所有权益编码 1. batchNo: 批次号
2.noteNo: 资产编码。
3.台账账期号。
4. 交易序列号。
启用权益¶
定义权益后,需要调用启用接口使权益转化为启用状态。
命令:
OpenLedger-demo>activeBatch $batchNo
返回:
result:true
返回启用是否成功。
eg:
OpenLedger-demo>activeBatch 1
登记权益所有权变更账目¶
账户拥有操作自己权益的权限。
生成签名¶
交易前需要使用交易转出方(from)私钥进行签名。
切换登录账户,使用当前登录账户生成签名
OpenLedger-demo>login $fromAddress
生成签名
OpenLedger-demo>generateTransferSign $from $to $noteNos
from
: 交易转出方账户地址,from需要等于当前账户。to
: 交易接收方账户地址。noteNos
: 资产编码列表,多个使用逗号分割。
返回签名字符串。
eg:
OpenLedger-demo>generateTransferSign 0x9250cd52f7c41ed9e015b2cd453aa97b310b309f 0x7250cdf2f7c41ed9e015b2cd453aa97b310b3093 20210001,20210002
执行签名交易¶
transfer $from $to $noteNos $sign
from
: 转出方账户地址。to
: 接收方账户地址。noteNos
: 权益编码列表,多个使用逗号分割。sign
: 通过上面生成签名操作的结果。
(上面1,2步骤可分离操作实现授权代理场景,即A客户端使用拥有者执行生成签名,把签名复制到B客户端使用组织管理员执行交易)
返回值:
transaction result:[TransferNoteResult(result=true, noteNo=20210003, termNo=1, SeqNo=127)]
result
: 操作是否成功。noteNo
: 变更权益编码。termNo
: 台账账期。seqNo
: 交易序列号。
例子:
A端为拥有者账户:
OpenLedger-demo>login $clientPrikey ## 登录拥有者账户
logon $clientAddr
OpenLedger-demo>generateTransferSign $from $to $noteNos ## from等于clientAddr
result:xxx ## 生成签名
OpenLedger-demo>transfer $from $to $noteNos $resultSign ##拥有者自己执行交易
B端为组织管理员:
resultSign
为A端生成签名结果
OpenLedger-demo>login $adminPrikey ## 登录组织管理员
OpenLedger-demo>transfer $from $to $noteNos $resultSign ##组织管理员执行交易,resultSign 为A端产生签名
eg:
OpenLedger-demo>transfer 0x9250cd52f7c41ed9e015b2cd453aa97b310b309f 0x3250cd52f7c41ed9e015b2cd453aa97b310b309f 20210001,20210003 112789897293472873979787989779
查询账户权益¶
查询账户是否拥有权益¶
需要登录管理员操作。
命令:
isAccountHoldNote $clientAddr $noteNo
clientAddr
: 查询账户地址。noteNo
: 权益编号。
返回Boolean类型,true则拥有,false则不拥有。
eg:
OpenLedger-demo>isAccountHoldNote 0x9250cd52f7c41ed9e015b2cd453aa97b310b309f 20210001
查询账户拥有的权益编号列表¶
查询账户的资产编号列表。
命令:
getAccountNotes $clientAddr $start $end
clientAddr
: 账户地址。start
: 查询列表起始值,从0开始。end
: 查询列表结束值。
返回账户权益编号列表。
eg:
OpenLedger-demo>getAccountNotes 0x9250cd52f7c41ed9e015b2cd453aa97b310b309f 0 10
台账查询¶
资产拥有者具有查询自己资产台账的权限。
执行签名交易¶
命令:
queryBook $conditon $sign
condition
: 查询条件列表同质化资产查询列表支持4个查询参数,分别为账期号、交易序列号、交易转出地址、交易接收地址,4个参数满足包含至少1个非0值即可, 若查询值为空则输入0。
eg:
[1,0,0,0x9250cd52f7c41ed9e015b2cd453aa97b310b309f]
查询账期号为1,0x9250cd52f7c41ed9e015b2cd453aa97b310b309f账户作为接收方的账本记录。
非同质化资产查询列表支持5个查询参数,分别为账期号、交易序列号、交易转出地址、交易接收地址、权益编号,5个参数满足包含至少1个非0值即可, 若查询值为空则输入0。
eg:
[1,0,0,0x9250cd52f7c41ed9e015b2cd453aa97b310b309f,0]
查询账期号为1,0x9250cd52f7c41ed9e015b2cd453aa97b310b309f账户作为接收方的账本记录。
sign
: 上面生成的签名。
返回:
demo默认返回前10条记录。
[NonFungibleAssetRecord(termNo=1, seq=32, from=0x0000000000000000000000000000000000000000, to=0xb7b1fa39fba52b6d5f248fb2b2c83779e617340a, noteNo=20210008, asset=0x3fe7b33c513555aa9f5b25e1e0f2c51da97e02ba, operator=0x688c9c9442001343aa44aa347a21112e605fc748, desc=desc)]
termNo
: 台账账期号。seq
: 序列号。from
: 转出地址。to
: 存入地址。noteNo
: 权益编码,仅非同质化返回。amount:
交易数量,仅同质化返回。operator
: 操作账户。desc
: 描述。