- 账户有基本账户、资产发布账户和合约账户三种类型。一个账户包含:账户名称,账户类型,地址,余额,投票,其他资产6种属性。
- 更进一步的,基本账户可以申请成为验证节点,验证节点具有额外的属性,投票统计数目,公钥,URL,以及历史表现等参数。
3种Account类型:Normal,AssetIssue,Contract。
enum AccountType {
Normal = 0;
AssetIssue = 1;
Contract = 2;
}
一个Account包含7种参数:
account_name:该账户的名称——比如: ”SicCongsAccount”。
type:该账户的类型——比如: 0 代表的账户类型是Normal。
balance:该账户的TRX余额——比如:4213312。
votes:账户所得投票数——比如:{(“0x1b7w…9xj3”,323),(“0x8djq…j12m”,88),…,(“0x82nd…mx6i”,10001)}。
asset:除TRX以外账户上的其他资产——比如:{<”WishToken”,66666>,<”Dogie”,233>}。
latest_operation_time: 该账户的最新活跃时间。
// Account
message Account {
message Vote {
bytes vote_address = 1;
int64 vote_count = 2;
}
bytes accout_name = 1;
AccountType type = 2;
bytes address = 3;
int64 balance = 4;
repeated Vote votes = 5;
map<string, int64> asset = 6;
int64 latest_operation_time = 10;
}
一个Witness包含8种参数:
address:验证节点的地址——比如:“0xu82h…7237”。
voteCount:验证节点所得投票数——比如:234234。
pubKey:验证节点的公钥——比如:“0xu82h…7237”。
url:验证节点的url链接。
totalProduce:验证节点产生的区块数——比如:2434。
totalMissed:验证节点丢失的区块数——比如:7。
latestBlockNum:最新的区块高度——比如:4522。
isJobs:布尔表类型标志位。
// Witness
message Witness {
bytes address = 1;
int64 voteCount = 2;
bytes pubKey = 3;
string url = 4;
int64 totalProduced = 5;
int64 totalMissed = 6;
int64 latestBlockNum = 7;
bool isJobs = 9;
}
- 一个区块由区块头和多笔交易构成。区块头包含时间戳,交易字典树的根,父哈希,签名等区块基本信息。
一个block包含transactions和block_header。
transactions:区块里的交易信息。
block_header:区块的组成部分之一。
// block
message Block {
repeated Transaction transactions = 1;
BlockHeader block_header = 2;
}
BlockHeader 包括raw_data和witness_signature。
raw_data:raw信息。
witness_signature:区块头到验证节点的签名。
message raw包含6种参数:
timestamp:该消息体的时间戳——比如:14356325。
txTrieRoot:Merkle Tree的根——比如:“7dacsa…3ed”。
parentHash:上一个区块的哈希值——比如:“7dacsa…3ed”。
number:区块高度——比如:13534657。
witness_id:验证节点的id——比如:“0xu82h…7237”。
witness_address:验证节点的地址——比如:“0xu82h…7237”。
message BlockHeader {
message raw {
int64 timestamp = 1;
bytes txTrieRoot = 2;
bytes parentHash = 3;
//bytes nonce = 5;
//bytes difficulty = 6;
uint64 number = 7;
uint64 witness_id = 8;
bytes witness_address = 9;
}
raw raw_data = 1;
bytes witness_signature = 2;
}
消息体 ChainInventory 包括 BlockId 和 remain_num。
BlockId: block的身份信息。
remain_num:在同步过程中,剩余的区块数量。
A BlockId contains 2 parameters:
hash: 该区块的哈希值。
number: 哈希值和高度即为当前区块块号。
message ChainInventory {
message BlockId {
bytes hash = 1;
int64 number = 2;
}
repeated BlockId ids = 1;
int64 remain_num = 2;
}
- 交易合约有多种类型,包括账户创建合约、账户更新合约、转账合约、转账断言合约、资产投票合约、见证节点投票合约、见证节点创建合约、见证节点更新合约、资产发布合约、参与资产发布和与部署合约11种类型。
AccountCreatContract包含3种参数:
type:账户类型——比如:0 代表的账户类型是Normal。
account_name: 账户名称——比如: "SiCongsaccount”。
owner_address:合约持有人地址——比如: “0xu82h…7237”。
message AccountCreateContract {
AccountType type = 1;
bytes account_name = 2;
bytes owner_address = 3;
}
AccountUpdateContract包含2种参数:
account_name: 账户名称——比如: "SiCongsaccount”。
owner_address:合约持有人地址——比如: “0xu82h…7237”。
message AccountUpdateContract {
bytes account_name = 1;
bytes owner_address = 2;
}
TransferContract包含3种参数:
amount:TRX数量——比如:12534。
to_address: 接收方地址——比如:“0xu82h…7237”。
owner_address:合约持有人地址——比如:“0xu82h…7237”。
message TransferContract {
bytes owner_address = 1;
bytes to_address = 2;
int64 amount = 3;
}
TransferAssetContract包含4种参数:
asset_name:资产名称——比如:”SiCongsaccount”。
to_address:接收方地址——比如:“0xu82h…7237”。
owner_address:合约持有人地址——比如:“0xu82h…7237”。
amount:目标资产数量——比如:12353。
message TransferAssetContract {
bytes asset_name = 1;
bytes owner_address = 2;
bytes to_address = 3;
int64 amount = 4;
}
VoteAssetContract包含4种参数:
vote_address:投票人地址——比如:“0xu82h…7237”。
support:投票赞成与否——比如:true。
owner_address:合约持有人地址——比如:“0xu82h…7237”。
count:投票数目——比如:2324234。
message VoteAssetContract {
bytes owner_address = 1;
repeated bytes vote_address = 2;
bool support = 3;
int32 count = 5;
}
VoteWitnessContract包含4种参数:
vote_address:投票人地址——比如:“0xu82h…7237”。
support:投票赞成与否——比如:true。
owner_address:合约持有人地址——比如:“0xu82h…7237”。
count:投票数目——比如:32632。
message VoteWitnessContract {
bytes owner_address = 1;
repeated bytes vote_address = 2;
bool support = 3;
int32 count = 5;
}
WitnessCreateContract包含3种参数:
private_key:合约的私钥——比如:“0xu82h…7237”。
owner_address:合约持有人地址——比如:“0xu82h…7237”。
url:合约的url链接。
message WitnessCreateContract {
bytes owner_address = 1;
bytes private_key = 2;
bytes url = 12;
}
WitnessUpdateContract包含2种参数:
owner_address:合约持有人地址——比如:“0xu82h…7237”。
update_url:合约的url链接。
message WitnessUpdateContract {
bytes owner_address = 1;
bytes update_url = 12;
}
AssetIssueContract包含11种参数:
name:合约名称——比如:“SiCongcontract”。
total_supply:合约的赞成总票数——比如:100000000。
owner_address:合约持有人地址——比如:“0xu82h…7237”。
trx_num:对应TRX数量——比如:232241。
num: 对应的自定义资产数目。
start_time:开始时间——比如:20170312。
end_time:结束时间——比如:20170512。
decav_ratio:衰减速率。
vote_score:合约的评分——比如:12343。
description:合约的描述——比如:”trondada”。
url:合约的url地址链接。
message AssetIssueContract {
bytes owner_address = 1;
bytes name = 2;
int64 total_supply = 4;
int32 trx_num = 6;
int32 num = 8;
int64 start_time = 9;
int64 end_time = 10;
int32 decay_ratio = 15;
int32 vote_score = 16;
bytes description = 20;
bytes url = 21;
}
ParticipateAssetIssueContract包含4种参数:
owner_address:合约持有人地址——比如:“0xu82h…7237”。
to_address:接收方地址——比如:“0xu82h…7237”。
asset_name: 目标资产的名称。
amount: 小部分数量。
DeployContract包含2种参数:
script:脚本。
owner_address:合约持有人地址——比如:“0xu82h…7237”。
message DeployContract {
bytes owner_address = 1;
bytes script = 2;
}
消息体 Result 包含 fee and ret2个参数.
ret: 交易结果。
fee: 交易扣除的费用。
code是ret的类型定义,有SUCCESS和FAILED两种类型。
message Result {
enum code {
SUCESS = 0;
FAILED = 1;
}
int64 fee = 1;
code ret = 2;
}
- 每一个交易还包含多个输入与多个输出,以及其他一些相关属性。其中交易内的输入,交易本身,区块头均需签名。
消息体 Transaction包括raw_data和signature。
raw_data: 消息体raw。
signature: 所有输入节点的签名。
raw_data包含8种参数:
type:消息体raw的交易类型。
vin: 输入值。
vout: 输出值。
expiration:过期时间——比如:20170312。
data: 数据。
contract: 该交易内的合约。
script: 脚本。
timestamp:该消息体的时间戳。
消息体 Contract包含type和parameter。
type:合约的类型。
parameter:任意参数。
有八种账户类型合约:AccountCreateContract,TransferContract,TransferAssetContract,VoteAssetContract,VoteWitnessContract,WitnessCreateContract,AssetIssueContract 和DeployContract。
TransactionType包括UtxoType和ContractType。
message Transaction {
enum TranscationType {
UtxoType = 0;
ContractType = 1;
}
message Contract {
enum ContractType {
AccountCreateContract = 0;
TransferContract = 1;
TransferAssetContract = 2;
VoteAssetContract = 3;
VoteWitnessContract = 4;
WitnessCreateContract = 5;
AssetIssueContract = 6;
DeployContract = 7;
}
ContractType type = 1;
google.protobuf.Any parameter = 2;
}
message raw {
TranscationType type = 2;
repeated TXInput vin = 5;
repeated TXOutput vout = 7;
int64 expiration = 8;
bytes data = 10;
repeated Contract contract = 11;
bytes scripts = 16;
in64 timestamp = 17;
}
raw raw_data = 1;
repeated bytes signature = 5;
}
消息体 TXOutputs由outputs构成。
outputs: 元素为TXOutput的数组。
message TXOutputs {
repeated TXOutput outputs = 1;
}
消息体 TXOutput包括value和pubKeyHash。
value:输出值。
pubKeyhash:公钥的哈希。
message TXOutput {
int64 value = 1;
bytes pubKeyHash = 2;
}
消息体 TXIutput包括raw_data和signature。
raw_data:消息体raw。
signature:TXInput的签名。
消息体 raw包含txID,vout和 pubKey。
txID:交易ID。
Vout:上一个输出的值。
pubkey:公钥。
message TXInput {
message raw {
bytes txID = 1;
int64 vout = 2;
bytes pubKey = 3;
}
raw raw_data = 1;
bytes signature = 4;
}
- 传输涉及的协议Inventory主要用于传输中告知接收方传输数据的清单。
Inventory包括type和ids。
type:清单类型——比如:0 代表TRX。
ids:清单中的物品ID。
InventoryType包含TRX和 BLOCK。
TRX:交易。
BLOCK:区块。
// Inventory
message Inventory {
enum InventoryType {
TRX = 0;
BLOCK = 1;
}
InventoryType type = 1;
repeated bytes ids = 2;
}
消息体 Items包含4种参数:
type:物品类型——比如:1 代表 TRX。
blocks:物品中区块。
blockheaders:区块头。
transactions:交易。
Items有四种类型,分别是 ERR, TRX,BLOCK 和BLOCKHEADER。
ERR:错误。
TRX:交易。
BLOCK:区块。
BLOCKHEADER:区块头。
message Items {
enum ItemType {
ERR = 0;
TRX = 1;
BLOCK = 2;
BLOCKHEADER = 3;
}
ItemType type = 1;
repeated Block blocks = 2;
repeated BlockHeader block_headers = 3;
repeated Transaction transactions = 4;
}
Inventory包含type和items。
type:物品种类。
items:物品清单。
message InventoryItems {
int32 type = 1;
repeated bytes items = 2;
}
消息体 BlockInventory 包含 type。
type: 清单种类.
有三种类型:SYNC, ADVTISE, FETCH。
// Inventory
message BlockInventory {
enum Type {
SYNC = 0;
ADVTISE = 1;
FETCH = 2;
}
消息体 BlockId 包括 ids and type。
ids: 区块身份信息。
type: 区块类型。
ids 包含2种参数:
hash: 区块的哈希值。
number: 哈希值和区块高度即为当前区块号。
message BlockId {
bytes hash = 1;
int64 number = 2;
}
repeated BlockId ids = 1;
Type type = 2;
}
ReasonCode 有15种可能断开的原因:
REQUESTED
TCP_ERROR
BAD_PROTOCOL
USELESS_PEER
TOO_MANY_PEERS
DUPLICATE_PEER
INCOMPATIBLE_PROTOCOL
NULL_IDENTITY
PEER_QUITING
UNEXPECTED_IDENTITY
LOCAL_IDENTITY
PING_TIMEOU
USER_REASON
RESET
UNKNOWN
enum ReasonCode {
REQUESTED = 0;
TCP_ERROR = 1;
BAD_PROTOCOL = 2;
USELESS_PEER = 3;
TOO_MANY_PEERS = 4;
DUPLICATE_PEER = 5;
INCOMPATIBLE_PROTOCOL = 6;
NULL_IDENTITY = 7;
PEER_QUITING = 8;
UNEXPECTED_IDENTITY = 9;
LOCAL_IDENTITY = 10;
PING_TIMEOUT = 11;
USER_REASON = 12;
RESET = 16;
UNKNOWN = 255;
}
消息体DisconnectMessage包含reason。
DisconnectMessage:断开连接是的消息。
reason:断开连接时的原因。
消息体HelloMessage包含2个参数:
from请:求建立连接的节点。
version:建立连接的节点。
- 钱包服务RPC和区块链浏览器。
Wallet钱包服务包含多个RPC。
Getbalance:获取Account的余额。
CreatTransaction:通过TransferContract创建交易。
BroadcastTransaction:广播Transaction。
CreateAccount:通过AccountCreateContract创建账户。
CreatAssetIssue:通过AssetIssueContract发布一个资产。
ListAccounts:通过ListAccounts查看账户列表。
UpdateAccount:通过UpdateAccountContract发布一个资产。
VoteWitnessAccount:通过VoteWitnessContract发布一个资产。
WitnessList:通过WitnessList查看见证节点列表。
UpdateWitness:通过WitnessUpdateContract发布一个资产。
CreateWitness:通过WitnessCreateContract发布一个资产。
TransferAsset:通过TransferAssetContract发布一个资产。
ParticipateAssetIssue:通过ParticipateAssetIssueContract发布一个资产。
ListNodes:通过ListNodes查看节点列表。
GetAssetIssueList:通过GetAssetIssueList查看资产发布节点列表。
GetAssetIssueByAccount:通过Account获取发行资产。
GetAssetIssueByName:通过Name获取发行资产。
GetNowBlock:获取区块。
GetBlockByNum:根据块号获取区块。
TotalTransaction:查看总交易量。
service Wallet {
rpc GetAccount (Account) returns (Account) {
};
rpc CreateTransaction (TransferContract) returns (Transaction) {
};
rpc BroadcastTransaction (Transaction) returns (Return) {
};
rpc ListAccounts (EmptyMessage) returns (AccountList) {
};
rpc UpdateAccount (AccountUpdateContract) returns (Transaction) {
};
rpc CreateAccount (AccountCreateContract) returns (Transaction) {
};
rpc VoteWitnessAccount (VoteWitnessContract) returns (Transaction) {
};
rpc CreateAssetIssue (AssetIssueContract) returns (Transaction) {
};
rpc WitnessList (EmptyMessage) returns (WitnessList) {
};
rpc UpdateWitness (WitnessUpdateContract) returns (Transaction) {
};
rpc CreateWitness (WitnessCreateContract) returns (Transaction) {
};
rpc TransferAsset (TransferAssetContract) returns (Transaction) {
}
rpc ParticipateAssetIssue (ParticipateAssetIssueContract) returns (Transaction) {
}
rpc ListNodes (EmptyMessage) returns (NodeList) {
}
rpc GetAssetIssueList (EmptyMessage) returns (AssetIssueList) {
}
rpc GetAssetIssueByAccount (Account) returns (AssetIssueList) {
}
rpc GetAssetIssueByName (BytesMessage) returns (AssetIssueContract) {
}
rpc GetNowBlock (EmptyMessage) returns (Block) {
}
rpc GetBlockByNum (NumberMessage) returns (Block) {
}
rpc TotalTransaction (EmptyMessage) returns (NumberMessage) {
}
};
AccountList: 区块链浏览器中的账户列表。
消息体 AccountList 包含1个参数:
account:
message AccountList {
repeated Account accounts = 1;
}
WitnessList:区块链浏览器中的见证节点列表。
消息体 WitnessList 包含1个参数:
witnesses:
message WitnessList {
repeated Witness witnesses = 1;
}
AssetIssueList:区块链浏览器中的发布资产列表。
消息体 AssetIssueList 包含1个参数:
assetIssue:
message AssetIssueList {
repeated AssetIssueContract assetIssue = 1;
}
NodeList: 分布节点图中的节点列表。
消息体 NodeList 包含1个参数:
nodes:
message NodeList {
repeated Node nodes = 1;
}
Address: 节点地址。
消息体Address 包含2个参数:
host:节点所有者。
port:节点的端口号。
message Address {
bytes host = 1;
int32 port = 2;
}
消息体Return只含有一个参数:
result: 布尔表类型标志位。
message `Return` {
bool result = 1;
}
- 网络UDP消息结构。
Endpoint:网络中节点信息存储结构.
消息体Endpoint 包含3个参数:
address:节点地址。
port:端口号。
nodeId: 节点ID信息。
message Endpoint {
bytes address = 1;
int32 port = 2;
bytes nodeId = 3;
}
PingMessage:节点建立连接时所发送的消息。
消息体PingMessage 包含4个参数:
from:消息来自的节点。
to: 消息发送的节点。
version: 网络版本。
timestamp:消息创建时的时间戳。
message PingMessage {
Endpoint from = 1;
Endpoint to = 2;
int32 version = 3;
int64 timestamp = 4;
}
PongMessage:连接建立成功时的回复消息。
消息体PongMessage 包含3个参数:
from:消息来自的节点。
echo:
timestamp:消息创建时的时间戳。
message PongMessage {
Endpoint from = 1;
int32 echo = 2;
int64 timestamp = 3;
}
FindNeighbours:节点查询相邻节点时所发送的消息。
消息体FindNeighbours 包含3个参数:
from: 消息来自的节点。
targetId: 目标节点的信息。
timestamp: 消息创建时的时间戳。
message FindNeighbours {
Endpoint from = 1;
bytes targetId = 2;
int64 timestamp = 3;
}
Neighbour:相邻接点回复消息。
消息体Neighbours 包含3个参数:
from: 消息来自的节点。
neighbours: 相邻节点。
timestamp: 消息创建时的时间戳。
message Neighbours {
Endpoint from = 1;
repeated Endpoint neighbours = 2;
int64 timestamp = 3;
}