# Contract
# 创建合约步骤
创建合约本质上是发起一笔类型为创建合约的交易,并指定创建合约的代码和参数。具体步骤如下:
- 调用
contract_createContractAddress
接口生成新合约地址。 - 根据 ABI 定义对构造函数的入参进行编码,如果构造函数没有入参,可以跳过这一步。可以使用
vitejs
的abi.encodeParameters
方法。 - 生成交易 data,data 内容为 14 字节固定长度前缀(10 字节委托共识组 id+1 字节合约类型 + 1 字节确认数 + 1 字节随机数种子数 + 1 字节配额翻倍数)+ 初始化代码(编译器编译出的合约代码)+ 第 2 步编码后的参数。
- 构造账户块,调用
ledger_sendRawTransaction
接口发起创建合约交易,其中toAddress
为第 1 步生成的合约地址;data
为第 3 步生成的交易数据;blockType
为 1,表示该交易为创建合约交易;amount
和tokenId
为调用合约构造函数时的转账金额和代币 id;fee
字段值为创建合约的 10 VITE 费用。
vitejs
的 builtinTxBlock.createContract
接口实现了以上逻辑。
创建合约参数说明:
- 委托共识组 id: 合约链上的响应交易由委托共识组的出块节点出块,目前只有公共委托共识组,id 为
00000000000000000002
。 - 合约类型:填 1,表示为 Solidity++ 合约。
- 确认数:发给合约账户的请求交易被多少个快照块确认之后出响应交易,取值范围 0-75,取 0 表示不需要等待请求交易被快照块确认。如果合约代码中使用了时间戳、快照块高度、随机数指令,要求这个字段值大于 0。取值越大,合约响应交易出块越慢。合约的每个响应交易会根据确认数收取额外的配额。
- 随机数确认数:发给合约账户的请求交易被多少个包含随机数的快照块确认之后出响应交易,取值范围 0-75,取 0 表示不需要等待请求交易被包含随机数的快照块确认。如果合约代码中使用了随机数指令,要求这个字段值大于 0,取值越大,随机数越安全。随机数确认数必须大于或等于确认数。
- 配额翻倍数:调用合约方法时请求交易收取多少倍配额,合约响应交易收取的配额不受影响。取值范围为 10-100,分别表示收取 1-10 倍配额,例如,取值为 15 时表示调用合约时对请求交易收取 1.5 倍的配额。
# 调用合约步骤
调用合约本质上是向合约账户发起一笔转账交易,并指定调用的接口和参数。具体步骤如下:
- 根据 ABI 定义对调用合约的方法名和参数进行编码,生成交易 data。可以使用
vitejs
的abi.encodeFunctionCall
方法。 - 构造账户块,调用
ledger_sendRawTransaction
接口发起调用合约交易,其中toAddress
为被调用的合约地址;data
为第 1 步生成的交易数据;blockType
为 2,表示该交易为转账交易或者调用合约交易;amount
和tokenId
为调用合约时的转账金额和代币 id;fee
字段值填 0。
vitejs
的 builtinTxBlock.callContract
接口实现了以上逻辑。
# 离线读取合约状态
Vite 链上部署的智能合约可以通过 getter
方法来离线读取合约状态。在编译合约时会生成 getter
方法的 ABI 定义和离线读取的代码。
- 根据 ABI 定义对合约离线读取接口的方法名和参数进行编码。这一步可以使用
vitejs
的abi.encodeFunctionCall
方法。 - 调用
contract_callOffChainMethod
方法,查询合约状态。
# 调用内置合约
调用内置合约和调用普通合约类似,也是向内置合约发起一笔转账交易,并指定调用的接口和参数。Vite 提供了配额、共识、铸币 3 个内置合约。
调用内置合约时,先根据内置合约的 ABI 定义对方法名和参数进行编码,然后通过 ledger_sendRawTransaction
给对应的合约发送交易。
vitejs
的 builtinTxBlock
模块封装了大部分内置合约的调用接口。
# 配额合约
# 合约账户地址
vite_0000000000000000000000000000000000000003f6af7459b9
# ABI
[
// 抵押获取配额(旧接口)
{"type":"function","name":"Stake", "inputs":[{"name":"beneficiary","type":"address"}]},
// 抵押获取配额
{"type":"function","name":"StakeForQuota", "inputs":[{"name":"beneficiary","type":"address"}]},
// 取消抵押(旧接口)
{"type":"function","name":"CancelStake","inputs":[{"name":"beneficiary","type":"address"},{"name":"amount","type":"uint256"}]},
// 取消抵押
{"type":"function","name":"CancelQuotaStaking","inputs":[{"name":"id","type":"bytes32"}]},
// 抵押获取配额,带回调
{"type":"function","name":"StakeForQuotaWithCallback", "inputs":[{"name":"beneficiary","type":"address"},{"name":"stakeHeight","type":"uint64"}]},
// 取消抵押,带回调
{"type":"function","name":"CancelQuotaStakingWithCallback","inputs":[{"name":"id","type":"bytes32"}]}
]
其中,代理抵押和取消代理抵押的回调方法定义如下:
[
// 抵押回调
{"type":"function","name":"StakeForQuotaWithCallbackCallback", "inputs":[{"name":"id","type":"bytes32"},{"name":"success","type":"bool"}]},
// 取消抵押回调
{"type":"function","name":"CancelQuotaStakingWithCallbackCallback","inputs":[{"name":"id","type":"bytes32"},{"name":"success","type":"bool"}]}
]
# Stake 抵押获取配额(旧接口)
抵押时需要转账,最少抵押 134 VITE
。抵押后 259200 个快照块(大约 3 天)后可以取回,多次给同一个配额受益地址抵押时,到期高度按最后一次抵押时的快照块高度计算。抵押到期后根据受益地址和金额取回抵押。
- Parameters:
beneficiary
:string address
配额受益地址
# StakeForQuota 抵押获取配额
抵押时需要转账,最少抵押 134 VITE
。抵押后 259200 个快照块(大约 3 天)后可以取回。多次给同一个配额受益地址抵押时,会生成多笔不同的抵押记录。抵押请求交易的块哈希为抵押 id,抵押到期后可以直接用这个 id 取回抵押。
- Parameters:
beneficiary
:string address
配额受益地址
# CancelStake 取消抵押(旧接口)
抵押到期后可以取消抵押,取消抵押时可以部分取消,取消抵押不影响抵押到期高度。
- Parameters:
beneficiary
:string address
配额受益地址amount
:string bigint
取消金额,单次取消抵押的金额不低于 134VITE
,剩余抵押金额不低于 134VITE
# CancelQuotaStaking 取消抵押
抵押到期后可以取消抵押,取消抵押时一次性取回该笔抵押的所有抵押金额。
- Parameters:
id
:string hash
抵押 id
注意:
- 旧接口抵押时,多次给同一个地址抵押会合并成一条,抵押到期高度按最后一次抵押时的快照块高度计算,取消时可以按金额分批取消或者一次性取消所有的抵押金额;新接口抵押时,多次给同一个地址抵押会生成多笔不同的记录,每笔记录的到期高度分别计算,取消时按抵押记录取消,一次性取消一笔抵押的所有金额。
- 旧接口的抵押,只能用旧接口取消抵押,新接口的抵押,只能用新接口抵押。例如,用
Stake
接口抵押,只能用CancelStake
接口取消抵押,不能用CancelQuotaStaking
接口取消抵押。
# StakeForQuotaWithCallback 抵押获取配额,带回调
同 StakeForQuota
,可以指定抵押高度。交易发起成功后,会收到一笔回调交易。
- Parameters:
beneficiary
:string address
配额受益地址stakeHeight
:string uint64
抵押高度,即多少个快照块后可以取消抵押,不低于 259200
# StakeForQuotaWithCallbackCallback 抵押回调
- Parameters:
id
:string hash
抵押 idsuccess
:bool
是否抵押成功,如果抵押失败,通过回调请求交易退回抵押金额
# CancelQuotaStakingWithCallback 取消抵押,带回调
同 CancelQuotaStaking
。交易发起成功后,会收到一笔回调交易。
- Parameters:
id
:string hash
抵押 id
# CancelQuotaStakingWithCallbackCallback 取消抵押回调
- Parameters:
id
:string hash
抵押 idsuccess
:bool
是否取消抵押成功,如果取消成功,通过回调请求交易退回抵押金额
# 共识合约
# 合约账户地址
vite_0000000000000000000000000000000000000004d28108e76b
# ABI
[
// 注册超级节点
{"type":"function","name":"RegisterSBP", "inputs":[{"name":"sbpName","type":"string"},{"name":"blockProducingAddress","type":"address"},{"name":"rewardWithdrawAddress","type":"address"}]},
// 更新超级节点出块地址
{"type":"function","name":"UpdateSBPBlockProducingAddress", "inputs":[{"name":"sbpName","type":"string"},{"name":"blockProducingAddress","type":"address"}]},
// 更新奖励提取地址
{"type":"function","name":"UpdateSBPRewardWithdrawAddress", "inputs":[{"name":"sbpName","type":"string"},{"name":"rewardWithdrawAddress","type":"address"}]},
// 注销超级节点
{"type":"function","name":"RevokeSBP","inputs":[{"name":"sbpName","type":"string"}]},
// 提取出块奖励
{"type":"function","name":"WithdrawSBPReward","inputs":[{"name":"sbpName","type":"string"},{"name":"receiveAddress","type":"address"}]},
// 给超级节点投票
{"type":"function","name":"VoteForSBP", "inputs":[{"name":"sbpName","type":"string"}]},
// 取消投票
{"type":"function","name":"CancelSBPVoting","inputs":[]}
]
# RegisterSBP 注册超级节点
注册超级节点时需要转账 100w VITE
作为抵押,超级节点注册成功后 7776000 个快照块(大约 3 个月)后可以注销超级节点。建议在注册超级节点前先准备好一台 gvite 节点,并同步到最新高度。
- Parameters:
sbpName
:string
超级节点名称,不允许重复blockProducingAddress
:string address
出块地址,建议将注册地址和出块地址分开rewardWithdrawAddress
:string address
奖励提取地址,注册成功后可以用注册地址或者奖励提取地址提取奖励
# UpdateSBPBlockProducingAddress 更新超级节点出块地址
超级节点未注销时,注册超级节点的地址可以发交易修改出块地址。例如当平滑迁移超级节点机器时,可以在新机器上配置一个新的出块地址,启动 gvite 节点,并同步到最新高度,然后发交易更新出块地址,再下掉旧节点。
- Parameters:
sbpName
:string
超级节点名称blockProducingAddress
:string address
新的出块地址
# UpdateSBPRewardWithdrawAddress 更新超级节点奖励提取地址
注册超级节点的地址可以发交易修改奖励提取地址。
- Parameters:
sbpName
:string
超级节点名称rewardWithdrawAddress
:string address
新的奖励提取地址
# RevokeSBP 注销超级节点
超级节点抵押到期后,可以注销超级节点。注销后超级节点不能再继续出块,也无法再获得超级节点奖励。
- Parameters:
sbpName
:string
超级节点名称
# WithdrawSBPReward 提取出块奖励
每个周期最后一轮排名在前 100 名的超级节点,可以在该周期结束 1 小时后提取超级节点奖励。超级节点注册地址和奖励提取地址都可以提取出块奖励。
- Parameters:
sbpName
:string
超级节点名称receiveAddress
:string address
奖励接收地址
# VoteForSBP 给超级节点投票
投票时不需要转账,计票时用当时的账户余额作为投票数。同一个账户多次发起投票请求交易,后一次投票的结果会覆盖前一次投票的结果。
- Parameters:
sbpName
:string
超级节点名称
# CancelSBPVoting 取消投票
投票可以随时取消。
# 铸币合约
# 合约账户地址
vite_000000000000000000000000000000000000000595292d996d
# ABI
[
// 铸币
{"type":"function","name":"IssueToken","inputs":[{"name":"isReIssuable","type":"bool"},{"name":"tokenName","type":"string"},{"name":"tokenSymbol","type":"string"},{"name":"totalSupply","type":"uint256"},{"name":"decimals","type":"uint8"},{"name":"maxSupply","type":"uint256"},{"name":"isOwnerBurnOnly","type":"bool"}]},
// 增发代币
{"type":"function","name":"ReIssue","inputs":[{"name":"tokenId","type":"tokenId"},{"name":"amount","type":"uint256"},{"name":"receiveAddress","type":"address"}]},
// 销毁代币
{"type":"function","name":"Burn","inputs":[]},
// 转移可增发代币的所有权
{"type":"function","name":"TransferOwnership","inputs":[{"name":"tokenId","type":"tokenId"},{"name":"newOwner","type":"address"}]},
// 将可增发代币修改为不可增发代币
{"type":"function","name":"DisableReIssue","inputs":[{"name":"tokenId","type":"tokenId"}]},
// 查询代币信息
{"type":"function","name":"GetTokenInformation","inputs":[{"name":"tokenId","type":"tokenId"}]},
// 铸币成功事件
{"type":"event","name":"issue","inputs":[{"name":"tokenId","type":"tokenId","indexed":true}]},
// 增发成功事件
{"type":"event","name":"reIssue","inputs":[{"name":"tokenId","type":"tokenId","indexed":true}]},
// 销毁成功事件
{"type":"event","name":"burn","inputs":[{"name":"tokenId","type":"tokenId","indexed":true},{"name":"burnAddress","type":"address"},{"name":"amount","type":"uint256"}]},
// 转移所有权成功事件
{"type":"event","name":"transferOwnership","inputs":[{"name":"tokenId","type":"tokenId","indexed":true},{"name":"owner","type":"address"}]},
// 修改代币类型成功事件
{"type":"event","name":"disableReIssue","inputs":[{"name":"tokenId","type":"tokenId","indexed":true}]}
]
其中,链上查询代币信息的回调方法定义如下:
[
// 查询代币信息回调
{"type":"function","name":"GetTokenInformationCallback","inputs":[{"name":"id","type":"bytes32"},{"name":"tokenId","type":"tokenId"},{"name":"exist","type":"bool"},{"name":"isReIssuable","type":"bool"},{"name":"tokenName","type":"string"},{"name":"tokenSymbol","type":"string"},{"name":"totalSupply","type":"uint256"},{"name":"decimals","type":"uint8"},{"name":"maxSupply","type":"uint256"},{"name":"isOwnerBurnOnly","type":"bool"},{"name":"index","type":"uint16"},{"name":"ownerAddress","type":"address"}]},
]
# IssueToken 铸币
铸币请求交易需要支付 1000 VITE
手续费。铸币成功后,铸币账户即为代币所有者,会收到一笔金额等于发行总量的在途交易。
- Parameters:
isReIssuable
:bool
是否可增发,true 可增发 false 不可增发tokenName
:string
代币名称,1 到 40 个字符,包含大小写字母、下划线、空格,不能以空格开头或结尾,不能包含连续空格tokenSymbol
:string
代币简称,1 到 10 个字符,包含大写字母、数字,不能使用VITE
、VCP
、VX
totalSupply
:string bigint
发行总量(最小单位),,不可增发代币 decimals
:uint8
小数位数,值为 0 时表示没有小数maxSupply
:string bigint
最大发行量(最小单位),不可增发代币此字段值填 0,可增发代币isOwnerBurnOnly
:bool
是否仅所有者可销毁,true 仅所有者可销毁 false 所有持币账户可销毁,不可增发代币此字段填 false
# ReIssue 增发代币
可增发代币的所有者可以发起交易来增发代币。
- Parameters:
tokenId
:string tokenId
代币 idamount
:string bigint
增发金额,增发交易会增加代币的发行总量,增发后的发行总量不能高于最大发行量receiveAddress
:string address
增发代币的接收地址
# Burn 销毁代币
可增发代币可以通过销毁代币交易来销毁,销毁时将需要销毁的金额转账给铸币合约。不可增发代币不能销毁。
# TransferOwnership 转移可增发代币的所有权
可增发代币的所有者可以将代币所有权转移给其他账户。不可增发代币不能转移所有权。
- Parameters:
tokenId
:string tokenId
代币 idnewOwner
:string address
新的所有者账户
# DisableReIssue 将可增发代币修改为不可增发代币
可增发代币的所有者可以将可增发代币修改为不可增发代币。
- Parameters:
tokenId
:string tokenId
代币 id
# GetTokenInformation 查询代币信息
- Parameters:
tokenId
:string tokenId
代币 id
# GetTokenInformationCallback 查询代币信息回调
- Parameters:
id
:string hash
查询请求交易的哈希tokenId
:string tokenId
代币 idexist
:bool
代币是否存在,true 存在 false 不存在isReIssuable
:bool
是否可增发,true 可增发 false 不可增发tokenName
:string
代币名称tokenSymbol
:string
代币简称totalSupply
:string bigint
发行总量decimals
:uint8
小数位数maxSupply
:string bigint
最大发行量,不可增发代币此字段值为 0isOwnerBurnOnly
:bool
是否仅所有者可销毁,true 仅所有者可销毁 false 所有持币账户可销毁,不可增发代币此字段值为 falseindex
:uint16
序号,从 0 开始,同名 tokenSymbol 的序号按铸币顺序递增owner
:string address
所有者账户
# contract_createContractAddress
创建合约时生成新的合约地址
Parameters:
string address
: 交易发起方账户地址string uint64
: 当前块高度string hash
: 交易发起方账户链上上一个块的哈希
Returns:
string address
新的合约地址
Example:
{
"jsonrpc":"2.0",
"id":1,
"method":"contract_createContractAddress",
"params":[
"vite_a5a7f08011c2f0e40ccd41b5b79afbfb818d565f566002d3c6",
"2",
"3a56babeb0a8140b12ac55e91d2e05c41f908ebe99767b0e4aa5cd7af22d6de7"]
}
{
"jsonrpc":"2.0",
"id":1,
"result": "vite_96a7911037179451bada2ab05ee070ba83dcfa2fac2ad6d770"
}
# contract_getContractInfo
查询合约信息
Parameters:
string address
: 合约账户地址
Returns:
ContractInfo
code
:string base64
合约代码gid
:string gid
合约所属委托共识组 idresponseLatency
:uint8
确认数randomDegree
:uint8
随机数确认数quotaMultiplier
:uint8
配额翻倍数
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getContractInfo",
"params": ["vite_22f4f195b6b0f899ea263241a377dbcb86befb8075f93eeac8"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"code": "AWCAYEBSYAQ2EGEAQVdgADV8AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQBGP/////FoBjkabLSxRhAEZXW2AAgP1bYQCJYASANgNgIIEQFWEAXFdgAID9W4EBkICANXT///////////////////////////8WkGAgAZCSkZBQUFBhAItWWwBbgHT///////////////////////////8WRmn/////////////FjRgQFFgQFGAggOQg4WH8VBQUFCAdP///////////////////////////xZ/qmUoH130tL08cfK6JZBbkHIF/OCAmoFu+OBLTUlqhbs0YEBRgIKBUmAgAZFQUGBAUYCRA5CiUFb+oWVienpyMFgg5BEYZploBADsJutGp1y0+UwegyI5VjOkuA+v2lg7JFoAKQ==",
"gid": "00000000000000000002",
"responseLatency": 2,
"randomDegree": 1,
"quotaMultiplier": 10
}
}
# contract_callOffChainMethod
离线调用合约的 getter 方法。
Parameters:
Params
:address
:string address
合约账户地址code
:string base64
用于离线查询的合约代码。即编译代码时指定--bin
参数后得到的OffChain Binary
代码。data
:string base64
按 ABI 定义编码后的调用参数,类似调用合约时的交易 data。
Returns:
string base64
按 ABI 定义编码后的 getter 方法返回值。可以使用 vitejs 的 abi decode 方法解码。
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_callOffChainMethod",
"params": [{
"address":"vite_22f4f195b6b0f899ea263241a377dbcb86befb8075f93eeac8",
"code":"YIBgQFJgBDYQYEJXYAA1fAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkARj/////xaAY8GjSGUUYERXYEJWWwBbYEpgYFZbYEBRgIKBUmAgAZFQUGBAUYCRA5DzW2AAYABgAFBUkFBgblZbkFb+oWVienpyMFggSaCBXUGf/Mh5lfHDLvGQt9g3K+aLjE2PrRxcLb6RSWQAKQ==",
"data":"waNIZQ=="
}]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
}
# contract_getContractStorage
离线查询合约存储。
Parameters:
string address
合约账户地址string
合约存储的十六进制 key 或者 key 的前缀
Returns:
map<string,string>
合约状态的十六进制 key 和 value
Example:
{
"jsonrpc": "2.0",
"id": 17,
"method": "contract_getContractStorage",
"params": ["vite_22f4f195b6b0f899ea263241a377dbcb86befb8075f93eeac8","0000000000000000000000000000000000000000000000000000000000000001"]
}
{
"jsonrpc": "2.0",
"id": 17,
"result": {
"0000000000000000000000000000000000000000000000000000000000000001": "01"
}
}
# contract_getQuotaByAccount
查询账户配额
Parameters:
string address
: 账户地址
Returns:
QuotaInfo
currentQuota
:string uint64
当前可用配额maxQuota
:string uint64
最大可用配额,即 utpe 对应的配额stakeAmount
:string bigint
抵押金额
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getQuotaByAccount",
"params": ["vite_ab24ef68b84e642c0ddca06beec81c9acb1977bbd7da27a87a"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"currentQuota": "1554000",
"maxQuota": "1575000",
"stakeAmount": "10000000000000000000000"
}
}
# contract_getStakeList
查询账户的抵押信息列表,按到期快照块高度倒序排序
Parameters:
string address
: 抵押账户地址int
: 页码,从 0 开始int
: 每页条数
Returns:
StakeListInfo
totalStakeAmount
:string bigint
本账户抵押的总金额totalStakeCount
:int
抵押信息总数stakeList
:Array<StakeInfo>
抵押信息列表stakeAddress
:string address
抵押地址stakeAmount
:string bigint
抵押金额expirationHeight
:string uint64
到期快照块高度,到期后可以取回抵押beneficiary
:string address
配额受益地址expirationTime
:int64
预估到期时间id
:string hash
抵押 id,值为空时表示通过旧接口抵押,取消抵押时需要调用旧接口CancelStake
;值非空时表示通过新接口抵押,取消抵押时需要调用新接口CancelQuotaStaking
Example:
{
"jsonrpc": "1.0",
"id": 1,
"method": "contract_getStakeList",
"params": ["vite_ab24ef68b84e642c0ddca06beec81c9acb1977bbd7da27a87a",0,10]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"totalStakeAmount": "1000000000000000000000",
"totalStakeCount": 1,
"stakeList": [
{
"stakeAmount": "1000000000000000000000",
"beneficiary": "vite_bd756f144d6aba40262c0d3f282b521779378f329198b591c3",
"expirationHeight": "1360",
"expirationTime": 1567490923,
"isDelegated": false,
"delegateAddress": "vite_0000000000000000000000000000000000000000a4f3a0cb58",
"stakeAddress": "vite_ab24ef68b84e642c0ddca06beec81c9acb1977bbd7da27a87a",
"bid": 0
}
]
}
}
# contract_getRequiredStakeAmount
根据配额计算最小抵押金额
Parameters:
string uint64
: 每秒使用的配额,例如:以 1/75 TPS 的交易频率发不带备注的转账交易,单笔交易消耗的配额为 21000,每秒消耗的配额为 21000/75=280,此时最少需要抵押 134 VITE
Returns:
string bigint
: 最小抵押金额
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getRequiredStakeAmount",
"params": ["280"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": "134000000000000000000"
}
# contract_getSBPList
查询注册的超级节点列表,包括已取消注册的超级节点,返回结果中未取消在前,已取消在后,按抵押到期高度倒序排列
Parameters:
string address
: 注册账户地址
Returns:
Array<SBPInfo>
name
:string
超级节点名称blockProducingAddress
:string address
签名快照块的账户地址rewardWithdrawAddress
:string address
奖励提取地址stakeAddress
:string address
抵押账户,即注册账户地址stakeAmount
:string bigint
抵押金额expirationHeight
:string uint64
抵押到期高度,到期后可以取消注册并取回抵押expirationTime
:int64
预估抵押到期时间revokeTime
:int64
取消注册时间,值为 0 时表示当前未取消
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getSBPList",
"params": ["vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"name": "s1",
"blockProducingAddress": "vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906",
"rewardWithdrawAddress": "vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906",
"stakeAddress": "vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906",
"stakeAmount": "1000000000000000000000000",
"expirationHeight": "7776000",
"expirationTime": 1575266076,
"revokeTime": 0
}
]
}
# contract_getSBPRewardPendingWithdrawal
查询超级节点待提取奖励
Parameters:
string
: 超级节点名称
Returns:
RewardInfo
totalReward
:string bigint
待提取奖励blockProducingReward
:string bigint
待提取按块奖励votingReward
:string bigint
待提取按票奖励producedBlocks
:string bigint
一个周期内的实际出块数,查询待提取奖励时此字段值为 0targetBlocks
:string bigint
一个周期内的应出块数,查询待提取奖励时此字段值为 0allRewardWithdrawed
:bool
值为 true 时表示节点已取消,并且所有的奖励已提取完
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getSBPRewardPendingWithdrawal",
"params": ["s1"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"blockProducingReward": "1499714611872146118517",
"votingReward": "746306845207209076970",
"totalReward": "2246021457079355195487",
"producedBlocks": "0",
"targetBlocks": "0",
"allRewardWithdrawed": false
}
}
# contract_getSBPRewardByTimestamp
按时间查询某一天所有超级节点的奖励
Parameters:
int64
: 时间戳,单位为秒,查询该时间戳所在周期的所有超级节点的奖励
Returns:
RewardByDayInfo
rewardMap
:map<string,RewardInfo>
同contract_getSBPRewardPendingWithdrawal
,其中allRewardWithdrawed
字段值为 falsestartTime
:int64
周期开始时间endTime
:int64
周期结束时间cycle
:string uint64
周期
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getSBPRewardByTimestamp",
"params": [1567440000]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"rewardMap": {
"s1": {
"blockProducingReward": "1499714611872146118517",
"votingReward": "746306845207209076970",
"totalReward": "2246021457079355195487",
"producedBlocks": "3153",
"targetBlocks": "3168",
"allRewardWithdrawed": false
},
"s2": {
"blockProducingReward": "0",
"votingReward": "0",
"totalReward": "0",
"producedBlocks": "0",
"targetBlocks": "3168",
"allRewardWithdrawed": false
}
},
"startTime": 1567396800,
"endTime": 1567483200,
"cycle": "104"
}
}
# contract_getSBPRewardByCycle
按周期查询某一天所有超级节点的奖励
Parameters:
string uint64
: 周期
Returns:
RewardByDayInfo
同contract_getSBPRewardByTimestamp
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getSBPRewardByCycle",
"params": ["104"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"rewardMap": {
"s1": {
"blockProducingReward": "1499714611872146118517",
"votingReward": "746306845207209076970",
"totalReward": "2246021457079355195487",
"producedBlocks": "3153",
"targetBlocks": "3168",
"allRewardWithdrawed": false
},
"s2": {
"blockProducingReward": "0",
"votingReward": "0",
"totalReward": "0",
"producedBlocks": "0",
"targetBlocks": "3168",
"allRewardWithdrawed": false
}
},
"startTime": 1567396800,
"endTime": 1567483200,
"cycle": "104"
}
}
# contract_getSBP
根据名称查询超级节点信息
Parameters:
string
: 超级节点名称
Returns:
SBPInfo
同contract_getSBPList
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getSBP",
"params": ["s1"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"name": "s1",
"blockProducingAddress": "vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906",
"rewardWithdrawAddress": "vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906",
"stakeAddress": "vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906",
"stakeAmount": "500000000000000000000000",
"expirationHeight": "7776000",
"expirationTime": 1575268146,
"revokeTime": 0
}
}
# contract_getSBPVoteList
查询所有超级节点当前获得的投票数
Parameters:
Returns:
Array<SBPVoteInfo>
sbpName
:string
超级节点名称blockProducingAddress
:string address
出块地址votes
:string bigint
投票数
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getSBPVoteList",
"params": []
}
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"sbpName": "s1",
"blockProducingAddress": "vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906",
"votes": "100000000000000000000"
},
{
"sbpName": "s2",
"blockProducingAddress": "vite_0acbb1335822c8df4488f3eea6e9000eabb0f19d8802f57c87",
"votes": "50000000000000000000"
}
]
}
# contract_getVotedSBP
查询投票信息
Parameters:
string address
: 账户地址
Returns:
VoteInfo
blockProducerName
:string
超级节点名称status
:uint8
超级节点注册状态:1 正常 2 已取消注册votes
:string bigint
账户投票数,即账户 VITE 余额
Example:
{
"jsonrpc": "1.0",
"id": 1,
"method": "contract_getVotedSBP",
"params": [
"vite_ab24ef68b84e642c0ddca06beec81c9acb1977bbd7da27a87a"
]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"blockProducerName": "s1",
"status": 1,
"votes": "599960989999999999999999997"
}
}
# contract_getSBPVoteDetailsByCycle
按周期查询当天最后一轮共识的超级节点的投票明细
Parameters:
string uint64
: 周期
Returns:
Array<SBPVoteDetail>
blockProducerName
:string
超级节点名称totalVotes
:string bigint
该超级节点在当天最后一轮共识结果中获得的总投票数blockProducingAddress
:string address
超级节点当前出块地址historyProducingAddresses
:Array<string address>
超级节点历史使用过的所有的出块地址addressVoteMap
:map<string address, string bigint>
投票明细
Example:
{
"jsonrpc": "1.0",
"id": 1,
"method": "contract_getSBPVoteDetailsByCycle",
"params": ["104"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"blockProducerName": "s1",
"totalVotes": "100000000000000000000",
"blockProducingAddress": "vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906",
"historyProducingAddresses": [
"vite_e41be57d38c796984952fad618a9bc91637329b5255cb18906"
],
"addressVoteMap": {
"vite_ab24ef68b84e642c0ddca06beec81c9acb1977bbd7da27a87a": "100000000000000000000"
}
},
{
"blockProducerName": "s2",
"totalVotes": "50000000000000000000",
"blockProducingAddress": "vite_0acbb1335822c8df4488f3eea6e9000eabb0f19d8802f57c87",
"historyProducingAddresses": [
"vite_0acbb1335822c8df4488f3eea6e9000eabb0f19d8802f57c87"
],
"addressVoteMap": {
"vite_56fd05b23ff26cd7b0a40957fb77bde60c9fd6ebc35f809c23": "50000000000000000000"
}
}
]
}
# contract_getTokenInfoList
分页查询代币信息列表
Parameters:
int
: 页码,从 0 开始int
: 每页条数
Returns:
TokenListInfo
totalCount
:int
代币信息总数tokenInfoList
:Array<TokenInfo>
见 TokenInfo
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getTokenInfoList",
"params": [0, 10]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"totalCount": 1,
"tokenInfoList": [
{
"tokenName": "Vite Token",
"tokenSymbol": "VITE",
"totalSupply": "1000000000000000000000000000",
"decimals": 18,
"owner": "vite_0000000000000000000000000000000000000004d28108e76b",
"tokenId": "tti_5649544520544f4b454e6e40",
"maxSupply": "115792089237316195423570985008687907853269984665640564039457584007913129639935",
"isReIssuable": true,
"index": 0,
"isOwnerBurnOnly": false
}
]
}
}
# contract_getTokenInfoById
根据代币 id 查询代币信息
Parameters:
string tokenId
: 代币 id
Returns:
TokenInfo
见 TokenInfo
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getTokenInfoById",
"params": ["tti_5649544520544f4b454e6e40"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tokenName": "VITE",
"tokenSymbol": "VITE",
"totalSupply": "999369292029736282857580488",
"decimals": 18,
"owner": "vite_0000000000000000000000000000000000000004d28108e76b",
"tokenId": "tti_5649544520544f4b454e6e40",
"maxSupply": "115792089237316195423570985008687907853269984665640564039457584007913129639935",
"isReIssuable": true,
"index": 0,
"isOwnerBurnOnly": false
}
}
# contract_getTokenInfoListByOwner
根据代币所有者账户地址查询代币信息列表
Parameters:
string address
: 代币所有者账户地址
Returns:
Array<TokenInfo>
见 TokenInfo
Example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "contract_getTokenInfoListByOwner",
"params": ["vite_0000000000000000000000000000000000000004d28108e76b"]
}
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"tokenName": "VITE",
"tokenSymbol": "VITE",
"totalSupply": "999411106171319027184734227",
"decimals": 18,
"owner": "vite_0000000000000000000000000000000000000004d28108e76b",
"tokenId": "tti_5649544520544f4b454e6e40",
"maxSupply": "115792089237316195423570985008687907853269984665640564039457584007913129639935",
"isReIssuable": true,
"index": 0,
"isOwnerBurnOnly": false
}
]
}