由於此文档涉及到账号等敏感信息,文中提到的方法仅供参考
文档路径 :
file:///(projectPath)/doc/index.html
- 唯链雷神区块链的私钥和地址格式兼容以太坊的私钥和地址。
- 以太坊的助记词不能在唯链雷神区块链上使用,原因coin type不同,所以无法生成同样的私钥。
如采用以太坊的工具和帐号管理方式,可參照:以太坊账号管理概述
子模块 | 网路 | 描述 |
---|---|---|
创建 | 主网 / 测试 | 允许用户创建一个或多个钱包,此地址为用户在VeChainThor中唯一标示 |
导出Key Store | 主网 / 测试 | 将Key Store导出。用于钱包恢复 |
导出私钥 | 主网 / 测试 | 将私钥导出。用于钱包恢复 |
导入 Key Store | 主网 / 测试 | 通过导入Key Store,恢复钱包 |
导入私钥 | 主网 / 测试 | 输入已保存的私钥恢复钱包 |
助记词恢复 | 主网 / 测试 | 输入已记录的助记词恢复钱包 |
界面除导航外分为左右两个区域 区域1:账号导入/创建
- 钱包列表
- 创建
- 导入(keyStore/私钥)
- 助记词
区域2:账号详情及具体操作
- 账号地址、余额显示
- 删除账号
- 更改交易密码
- 导出 key store
- 导出私钥
API参照:
AccountClient
Console参照:
Create Wallet
交易字段的定义可以参考:https://github.com/vechain/thor/wiki/Transaction-Model
唯链雷神区块链的交易构造时建议有两个参数实时从链上获取
chainTag
,是创世区块的最后一个字节,用于区分主链,测试链的tag。blockRef
,是uint64的变量,交易需要block id的前8字节作为参考。同时也被用于和expiration字段一起来作为交易时间有效性的判断。如果当前blocknumber > blockRef对应对区块高度 + expiration,则该交易被丢弃。
界面除导航外,分为上下两个区域: 区域1: 选择需要构建的交易类型
- Single Transaction
- Multi Transaction
- Contract Deployment
区域2: 构建交易内容
- 由于VeChainThor的特性,增加了一些参数供使用者填写
单笔交易如同以太坊,由一个交易发起人发送一笔交易至一个交易接收者。
字段 | 说明 | 备注 |
---|---|---|
from | 交易发起地址 | - |
to | 交易接收地址 | - |
value | 转账金额 | VET为单位 |
expiration | 用于设置交易过期/失效时间 | 区块为单位/建议值为18 Block Number ∈[blockRef.number , BlockRef.number + expiration] |
maximum gas | 允许消耗的gas总量 | - |
一个交易可以包含零个或多个交易子句 ,用户无需借助合约就可在一个交易中执行多个任务;同时保持交易的原子性(原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败)。假设为一笔转账交易, 交易子句可以让原先只能一笔交易只能发往一个地址的限制,交易子句可以让一个发起人向多个接收者。
字段 | 说明 | 备注 |
---|---|---|
from | 交易发起地址 | - |
expiration | 用于设置交易过期/失效时间 | 区块为单位/建议值为18 Block Number ∈[blockRef.number , BlockRef.number + expiration] |
to | 交易接收地址 | - |
value | 操作VET数值 | - |
data | 十六进制内容 | - |
将合约部署到VeChainThor网路中
字段 | 说明 | 备注 |
---|---|---|
contract deployer | 部署合约人 | 将从account列表中选取 |
contract Data | 部署合约的十六进制内容 | 用户需自行将要部署的内容转成十六进制格式 |
expiration | 用于设置交易过期/失效 | 区块为单位/建议值为18 Block Number ∈[blockRef.number , BlockRef.number + expiration] |
Maximum gas | 允许消耗的gas总量 | 单位:Wei |
以下字段皆为可选参数
字段 | 说明 | 备注 |
---|---|---|
gasPriceCoef | 用户可根据调整该数值调整交易的优先级 | 默认值为0,取值范围为∈[0,255] |
dependsOn | 被依赖的交易的ID | 若此字段不为空, 則只有当它指定的交易已存在时,此交易才会被执行 |
blockRef | 对之前block的引用, 允许设置交易必须在某个时间之后执行; 可以以度量交易的延迟 | SYNC默认获取当前BestBlock的区块ID来生成blockRef; |
当交易构建完成后, 输入消息发出者的密码后,若密码正确后, 即可对交易进行签名
1.API详见
1.Sign VET transaction
2.Sign VTHO transaction
2.console详见
1.Sign VET transaction
参照:
1.Prototype
2.Prototype Client
Amount credit = Amount.VTHO();
credit.setDecimalAmount( "12.00" );//用户可使用最高额度(VTHO)上限
Amount recovery = Amount.VTHO();
recovery.setDecimalAmount( "0.00001" );//额度(VTHO)每秒的回复率
TransferResult result = ProtoTypeContractClient.setCreditPlans(
new Address[]{Address.fromHexString( "0xD3EF28DF6b553eD2fc47259E8134319cB1121A2A")},
new Amount[]{credit},
new Amount[]{recovery},
ContractClient.GasLimit, (byte)0x0, 720, ECKeyPair.create( "0xeb78d6405ba1a28ccd938a72195e0802dfbe1de463bc6e5dd491b2c7562b5e3f" ) );
logger.info( "set credit plans:" + JSON.toJSONString( result ) );
假设目前交易费用为21VTHO(具体以实际网络参数为准),在设置CreditPlan时可为每位用户每天限制1次操作且隔日恢复。那么可以将CreditPlan的credit 及 ecoveryRate设置如下:
1.credit : 可设置为credit.setDecimalAmount( "21.00" )
2.recoveryRate: recovery.setDecimalAmount( "0.00024305555" ) // 0.00024305555 = 21 / 86400
1.限制:仅限合约控制者及合约本身可调用此方法
2.对象:合约内所有用户
Insights可让VeChainThor中的数据可视化,并且实时展示。用户可通过以下内容进行链上信息的查询
默认进入insights会实时加载最新块查询,若需要查询特定区块ID/区块编号信息,可通过输入进行查询
若有Branch标签,则代表此区块并非在主链上
字段 | 说明 |
---|---|
block number | 区块编号 |
block ID | 区块ID |
size | 编码过的RLP字节大小 |
parent ID | 父区块ID |
timestamp | 时间戳 |
total Score | TotalScore为从创始块开始,每个blockScore的总和 |
number of Transaction | 区块中所包含的交易数 |
gas limit | 区块消耗的gas总量 |
signer | 区块打包者 |
beneficiary | 区块奖励接收者 |
txRoot | 区块中交易根哈希 |
stateRoot | account state根哈希 |
receiptsRoot | transaction Receipts 根哈希 |
由于Insights为已上链数据查询, 查询到的交易皆有Receipt
若有Branch标签,则代表此区块并非在主链上
Tx Info
字段 | 说明 |
---|---|
txID | 交易唯一标识 |
timeStamp | 时间戳 |
from | 交易发起人 |
block Number | 所属区块编号 |
block Id | 所属区块唯一标识 |
block Ref | 引用的区块ID |
depends On | 引用的交易ID |
nonce | 随机数 |
gas | 允许消耗的gas总量 |
expiration | 交易过期/失效区块数 |
gas used by transaction | 交易实际消耗的Gas总量 |
gas price Coefficient | 交易系数将会影响交易打包优先级,交易系数∈[0 , 255] |
clauses | 交易子句总数 |
to | 交易接收人 |
value | 交易数值 |
data | 十六进制信息 |
Receipt
字段 | 說明 |
---|---|
gas Payer | 交易支付者 |
paid (VTHO) | 支付金额 |
tx Reward (VTHO) | 出块节点奖励 |
outputs | 事件日志 |
通过地址查询,可查看地址详情
字段 | 说明 |
---|---|
address | 所查询的地址 |
available VET | 可用VET余额 |
available VTHO | 可用VTHO余额 |
transactions | 已发出的交易明细 |
1.API
详见API
2.Console
详见java console
通过java console指令:
1.java console:
java -jar thor-client-sdk4j-0.0.2.jar getBlock "http://localhost:8669"
2.java api:
//获取最新区块 get best block
Block block = BlockClient.getBlock(Revision.BEST);
System.out.println(JSON.toJSONString(block));
或
//获取指定的块 get specified block
Revision revision = Revision.create(148847);
Block block = BlockClient.getBlock(revision);
System.out.println(JSON.toJSONString(block));
- best block
{
"beneficiary": "0xafbd76f9cdd19015c2d322a35bbea0480f5d70e1",
"gasLimit": 10448965,
"gasUsed": 0,
"id": "0x00026bfa7cbbd7c8cf643e45eadff1ddce1395cc47a5c08c521498f693381840",
"isTrunk": true,
"number": "158714",
"parentID": "0x00026bf9c0828062b25d0b23df0c99f6571af389d273961b82c90906a0a96b1b",
"receiptsRoot": "0x45b0cfc220ceec5b7c1c62c4d4193d38e4eba48e8815729ce75f9c0ab0e4c1c0",
"signer": "0xafbd76f9cdd19015c2d322a35bbea0480f5d70e1",
"size": 239,
"stateRoot": "0xa8dd31b95e227b92e800d65c824d2fb124a36e924b398252ec995d3611a69d43",
"timestamp": 1530016140,
"totalScore": 1034108,
"transactions": [],
"txsRoot": "0x45b0cfc220ceec5b7c1c62c4d4193d38e4eba48e8815729ce75f9c0ab0e4c1c0"
}
- specified block
{
"beneficiary": "0x0000000000000000000000000000000000000000",
"gasLimit": 10000000,
"gasUsed": 0,
"id": "0x00000000ef3b214ad627b051f42add3b93b2f913f2594b94a64b2377b0f9159a",
"isTrunk": true,
"number": "0",
"parentID": "0xffffffff00000000000000000000000000000000000000000000000000000000",
"receiptsRoot": "0x45b0cfc220ceec5b7c1c62c4d4193d38e4eba48e8815729ce75f9c0ab0e4c1c0",
"signer": "0x0000000000000000000000000000000000000000",
"size": 170,
"stateRoot": "0x120df3368f409525ed30fd98c999af8d66bfa553cae14005fc3b7f00bcc60de1",
"timestamp": 1528387200,
"totalScore": 0,
"transactions": [],
"txsRoot": "0x45b0cfc220ceec5b7c1c62c4d4193d38e4eba48e8815729ce75f9c0ab0e4c1c0"
}
其中transactions字段是该block中所有交易的txID。
通过java console指令:
1.java console:
java -jar thor-client-sdk4j-0.0.2.jar getTransaction "0x255576013fd61fa52f69d5d89af8751731d5e9e17215b0dd6c33af51bfe28710" "http://localhost:8669"
2.java api
Transaction transaction = TransactionClient.getTransaction("0x255576013fd61fa52f69d5d89af8751731d5e9e17215b0dd6c33af51bfe28710", false, null);
System.out.println("transaction"+JSON.toJSONString(transaction));
返回交易信息:
{
id: '0x255576013fd61fa52f69d5d89af8751731d5e9e17215b0dd6c33af51bfe28710',
chainTag: '0x9a',
blockRef: '0x0002456e56ae5827',
expiration: 720,
clauses:
[
{
"to": "0xB2ef3293Bb6c886d9e57ba205c46450B6d48A0A1",
"value": "1234560000000000000",
"data": "0x"
},
{
"to": "0x0000000000000000000000000000456E65726779",
"value": "0",
"data": "0xa9059cbb000000000000000000000000b2ef3293bb6c886d9e57ba205c46450b6d48a0a100000000000000000000000000000000000000000000000000000000000003ff"
}
],
gasPriceCoef: 0,
gas: 100000,
origin: '0x267Dc1dF3e82E6BdAD45156C7c31Aad36DF2B5Fa',
nonce: '0x164362fbdd0',
dependsOn: null,
size: 224,
meta:
{ blockID: '0x0002456fe81e6df0548a327faa3c1764eff7c3b7ce5cf1d1d27264818e78ea8c',
blockNumber: 148847,
blockTimestamp: 1529917460 },
}
}
从返回的transaction信息可以看到交易的具体内容。
1.java console:
java -jar thor-client-sdk4j-0.0.2.jar getTransactionReceipt "0x255576013fd61fa52f69d5d89af8751731d5e9e17215b0dd6c33af51bfe28710" "http://localhost:8669"
2.java api
Receipt receipt = TransactionClient.getTransactionReceipt("0x255576013fd61fa52f69d5d89af8751731d5e9e17215b0dd6c33af51bfe28710", null);
System.out.println("receipt"+JSON.toJSONString(receipt));
返回交易单据信息:一个交易中包括两个子句,一个是VET转账,一个是VTHO转账。
{
"gasUsed": 51462,
"gasPayer": "0x267Dc1dF3e82E6BdAD45156C7c31Aad36DF2B5Fa",
"paid": "0x2ca2dc057b7270000",
"reward": "0xd640ece71d588000",
"reverted": false,
"meta": {
"blockID": "0x0002456fe81e6df0548a327faa3c1764eff7c3b7ce5cf1d1d27264818e78ea8c",
"blockNumber": 148847,
"blockTimestamp": 1529917460,
"txID": "0x255576013fd61fa52f69d5d89af8751731d5e9e17215b0dd6c33af51bfe28710",
"txOrigin": "0x267Dc1dF3e82E6BdAD45156C7c31Aad36DF2B5Fa"
},
"outputs": [
{
"contractAddress": null,
"events": [],
"transfers": [
{
"sender": "0x267dc1df3e82e6bdad45156c7c31aad36df2b5fa",
"recipient": "0xb2ef3293bb6c886d9e57ba205c46450b6d48a0a1",
"amount": "0x112209c76de80000"
}
]
},
{
"contractAddress": null,
"events": [
{
"address": "0x0000000000000000000000000000456E65726779",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x000000000000000000000000267dc1df3e82e6bdad45156c7c31aad36df2b5fa",
"0x000000000000000000000000b2ef3293bb6c886d9e57ba205c46450b6d48a0a1"
],
"data": "0x00000000000000000000000000000000000000000000000000000000000003ff"
}
],
"transfers": []
}
]
}
-
建议交易确认区块为
12
个区块以上 -
在区块中的交易说明都被执行了。但交易是否执行成功,可以查看交易单据的
reverted
字段,如果reverted字段为false
,则说明交易被执行成功了。如果reverted字段为true
,说明交易执行失败。 -
在交易单据中, Output将会显示此交易所包含的转账信息
若为转账VTHO,可查看Output中的
events
,说明如下:-
需确保合约地址
0x0000000000000000000000000000456e65726779
-
Topics中:
- 条目一为: events调用哈希,需确保哈希值为
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
- 条目二为: 交易发起方
- 条目三为: 交易接受方
- 条目一为: events调用哈希,需确保哈希值为
-
data: 转账数值,默认返回16进制且数值单位为10^18 (Wei)。 比如上面data的值为:0x3ff = 1023 wei VTHO,即时1023*10^-18 VTHO。
可查看Output中
transfer
数组,其中,将会包含交易发起人、交易接受人、转账金额。sender
,recipient
,amount
。amount
- 默认返回16进制且数值单位为10^18 (Wei)。比如上面单据中transfers的amount为十六进制:0x112209c76de80000,转换为十进制是1234560000000000000 wei,因为VET是18decimal的,所以转换为VET为1.23456 VET -
唯链雷神区块链交易是消耗gas,gas通过gasPrice转为为VTHO,并通过扣除账户VTHO来进行交易费用的结算。每个交易中包含交易系数(gasPriceCoef), 计算公式为:
VTHO = (1 + gasPriceCoef/255) * baseGasPrice
目前主网设定的baseGasPrice为: 1 VTHO = 1000gas(具体以实际网络参数为准),普通VET转账交易费用是21000gas。如果gasPriceCoef = 0,则:
消耗的VTHO = (1 + 0/255) * 21000/1000 = 21 VTHO
- 可以通过调整gasPriceCoef来提高交易在masterNode交易池中优先级。比如设定gasPriceCoef = 128,则
消耗的VTHO = (1 + 128/255) * 21000/1000 = 31.5 VTHO