Commit 48dbbc8b authored by 张振华's avatar 张振华

Merge branch 'master' into guess-rpc-test

parents 16d381fc e3d68c56
......@@ -18,8 +18,8 @@ import (
)
var (
consensusInterval = 16 //about 1 new block interval
minerInterval = 5
consensusInterval = 10 //about 1 new block interval
minerInterval = 10 //5s的主块间隔后分叉概率增加,10s可以消除一些分叉回退
)
type commitMsgClient struct {
......
......@@ -137,7 +137,6 @@ function para_transfer() {
block_wait "${CLI}" 2
# para_create_manage_nodegroup
para_create_nodegroup
echo "=========== # config token blacklist ============="
#token precreate
......@@ -179,87 +178,6 @@ function para_transfer2exec() {
echo "${hash1}"
}
function para_create_nodegroup_test() {
echo "=========== # para chain create node group ============="
##apply
txhash=$(${PARA_CLI} send para nodegroup -o 1 -a "1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4,1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR,1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k,1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs" -c 5 -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
status=$(${PARA_CLI} para nodegroup_status -t user.p.para. | jq -r ".status")
if [ "$status" != 1 ]; then
echo "status not apply status=$status"
exit 1
fi
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "20.0000" ]; then
echo "apply coinfrozen error balance=$balance"
exit 1
fi
echo "=========== # para chain quit node group ============="
##quit
txhash=$(${PARA_CLI} send para nodegroup -o 3 -a "1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4,1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR,1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k,1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs" -c 5 -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
status=$(${PARA_CLI} para nodegroup_status -t user.p.para. | jq -r ".status")
if [ "$status" != 3 ]; then
echo "status not quit status=$status"
exit 1
fi
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".balance")
if [ "$balance" != "100.0000" ]; then
echo "quit coinfrozen error balance=$balance"
exit 1
fi
}
function para_create_nodegroup() {
para_create_nodegroup_test
echo "=========== # para chain create node group again ============="
##apply
txhash=$(${PARA_CLI} send para nodegroup -o 1 -a "1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY,1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4,1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR,1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k,1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs" -c 5 -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
status=$(${PARA_CLI} para nodegroup_status -t user.p.para. | jq -r ".status")
if [ "$status" != 1 ]; then
echo "status not apply status=$status"
exit 1
fi
echo "=========== # para chain approve node group ============="
##approve
txhash=$(${PARA_CLI} send para nodegroup -o 2 -a "1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY,1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4, 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR, 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k, 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs," -k 0xc34b5d9d44ac7b754806f761d3d4d2c4fe5214f6b074c19f069c4f5c2a29c8cc)
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
status=$(${PARA_CLI} para nodegroup_status -t user.p.para. | jq -r ".status")
if [ "$status" != 2 ]; then
echo "status not approve status=$status"
exit 1
fi
${PARA_CLI} para nodegroup_addrs -t user.p.para.
echo "=========== # para chain quit node group fail ============="
##quit fail
txhash=$(${PARA_CLI} send para nodegroup -o 3 -a "1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY,1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4,1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR,1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k,1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs" -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
echo "tx=$txhash"
query_tx "${CLI}" "${txhash}"
status=$(${CLI} para nodegroup_status -t user.p.para. | jq -r ".status")
if [ "$status" != 2 ]; then
echo "status quit not approve status=$status"
exit 1
fi
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "25.0000" ]; then
echo "quit fail coinfrozen error balance=$balance"
exit 1
fi
}
function para_create_manage_nodegroup() {
echo "=========== # para chain send config ============="
para_configkey "${CLI}" "paracross-nodes-user.p.${PARANAME}." "1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4"
......@@ -396,7 +314,7 @@ function para_cross_transfer_withdraw() {
sleep 15
${CLI} send para asset_withdraw --title user.p.para. -a 0.7 -n test -t 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
local times=100
local times=200
while true; do
acc=$(${CLI} account balance -e paracross -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv | jq -r ".balance")
echo "account balance is ${acc}, expect 9.3 "
......@@ -502,6 +420,180 @@ function para_cross_transfer_withdraw_for_token() {
done
}
function para_create_nodegroup_test() {
echo "=========== # para chain create node group test ============="
##apply
txhash=$(${PARA_CLI} send para nodegroup -o 1 -a "1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4,1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR,1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k,1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs" -c 5 -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
id=$(${PARA_CLI} tx query -s "${txhash}" | jq -r ".receipt.logs[0].log.current.id")
if [ -z "$id" ]; then
${PARA_CLI} tx query -s "${txhash}"
echo "group id not getted"
exit 1
fi
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "20.0000" ]; then
echo "apply coinfrozen error balance=$balance"
exit 1
fi
echo "=========== # para chain quit node group ============="
##quit
txhash=$(${PARA_CLI} send para nodegroup -o 3 -i "$id" -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
newid=$(${PARA_CLI} para nodegroup_list -s 3 | jq -r ".ids[0].id")
if [ -z "$newid" ]; then
${PARA_CLI} para nodegroup_list -s 3
echo "quit status error "
exit 1
fi
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".balance")
if [ "$balance" != "100.0000" ]; then
echo "quit coinfrozen error balance=$balance"
exit 1
fi
}
function para_create_nodegroup() {
para_create_nodegroup_test
echo "=========== # para chain create node group again ============="
##apply
txhash=$(${PARA_CLI} send para nodegroup -o 1 -a "1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY,1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4,1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR,1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k,1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs" -c 6 -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
id=$(${PARA_CLI} tx query -s "${txhash}" | jq -r ".receipt.logs[0].log.current.id")
if [ -z "$id" ]; then
${PARA_CLI} tx query -s "${txhash}"
echo "group id not getted"
exit 1
fi
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "30.0000" ]; then
echo "apply coinfrozen error balance=$balance"
exit 1
fi
echo "=========== # para chain approve node group ============="
##approve
txhash=$(${PARA_CLI} send para nodegroup -o 2 -i "$id" -c 6 -k 0xc34b5d9d44ac7b754806f761d3d4d2c4fe5214f6b074c19f069c4f5c2a29c8cc)
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
status=$(${PARA_CLI} para nodegroup_status -t user.p.para. | jq -r ".status")
if [ "$status" != 2 ]; then
echo "status not approve status=$status"
exit 1
fi
${PARA_CLI} para nodegroup_addrs -t user.p.para.
echo "=========== # para chain quit node group fail ============="
##quit fail
txhash=$(${PARA_CLI} send para nodegroup -o 3 -i "$id" -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
echo "tx=$txhash"
query_tx "${CLI}" "${txhash}"
status=$(${CLI} para nodegroup_status -t user.p.para. | jq -r ".status")
if [ "$status" != 2 ]; then
echo "status quit not approve status=$status"
exit 1
fi
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "30.0000" ]; then
echo "quit fail coinfrozen error balance=$balance"
exit 1
fi
echo "=========== # para chain modify node group coin=5 ============="
txhash=$(${PARA_CLI} send para nodegroup -o 4 -c 5 -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
echo "tx=$txhash"
query_tx "${CLI}" "${txhash}"
modifyid=$(${PARA_CLI} para nodegroup_list -s 4 | jq -r ".ids[0].id")
if [ -z "$modifyid" ]; then
echo "query modify error "
${PARA_CLI} para nodegroup_list -s 4
modifyid=$(${PARA_CLI} tx query -s "${txhash}" | jq -r ".receipt.logs[0].log.current.id")
if [ -z "$modifyid" ]; then
${PARA_CLI} tx query -s "${txhash}"
echo "group id not getted"
exit 1
fi
fi
##approve
txhash=$(${PARA_CLI} send para nodegroup -o 2 -i "$modifyid" -c 5 -k 0xc34b5d9d44ac7b754806f761d3d4d2c4fe5214f6b074c19f069c4f5c2a29c8cc)
echo "tx=$txhash"
query_tx "${PARA_CLI}" "${txhash}"
id=$(${PARA_CLI} para nodegroup_status -t user.p.para. | jq -r ".id")
if [ "$modifyid" != "$id" ]; then
echo " approve new id wrong"
${PARA_CLI} para nodegroup_status -t user.p.para.
exit 1
fi
coins=$(${PARA_CLI} para nodegroup_status -t user.p.para. | jq -r ".coinsFrozen")
if [ "$coins" != "500000000" ]; then
echo " approve new coins wrong"
${PARA_CLI} para nodegroup_status -t user.p.para.
exit 1
fi
}
function para_nodegroup_behalf_quit_test() {
echo "=========== # para chain behalf node quit ============="
id=$(${PARA_CLI} para node_status -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -t user.p.para. | jq -r ".id")
if [ -z "${id}" ]; then
echo "wrong id "
${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY
exit 1
fi
hash=$(${PARA_CLI} send para node -o 3 -i "$id" -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
status=$(${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY | jq -r ".status")
if [ "${status}" != "3" ]; then
echo "wrong vote status"
${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY
exit 1
fi
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588
hash=$(${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
status=$(${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY | jq -r ".status")
if [ "${status}" != "4" ]; then
echo "wrong vote status"
${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY
exit 1
fi
node=$(${PARA_CLI} para nodegroup_addrs -t user.p.para. | jq -r '.value|contains("1E5")')
if [ "${node}" == "true" ]; then
echo "wrong node group addr"
${PARA_CLI} para nodegroup_addrs -t user.p.para.
exit 1
fi
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "24.0000" ]; then
echo "unfrozen coinfrozen error balance=$balance"
exit 1
fi
}
function para_nodemanage_node_join() {
echo "================# para node manage test ================="
balance=$(${CLI} account balance -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -e paracross | jq -r ".balance")
......@@ -511,7 +603,7 @@ function para_nodemanage_node_join() {
fi
echo "=========== # para chain new node join ============="
hash=$(${PARA_CLI} send para node -o join -c 5 -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588)
hash=$(${PARA_CLI} send para node -o 1 -c 5 -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
......@@ -525,12 +617,12 @@ function para_nodemanage_node_join() {
function para_nodemanage_node_behalf_join() {
echo "=========== # para chain new node join 1 ============="
hash=$(${PARA_CLI} send para node -o join -c 8 -a 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
hash=$(${PARA_CLI} send para node -o 1 -c 8 -a 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "28.0000" ]; then
if [ "$balance" != "32.0000" ]; then
echo "1Ka frozen coinfrozen error balance=$balance"
exit 1
fi
......@@ -542,23 +634,29 @@ function para_nodemanage_node_behalf_join() {
fi
echo "=========== # para chain new node join 2============="
hash=$(${PARA_CLI} send para node -o join -c 9 -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
hash=$(${PARA_CLI} send para node -o 1 -c 9 -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -k 0xd165c84ed37c2a427fea487470ee671b7a0495d68d82607cafbc6348bf23bec5)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "37.0000" ]; then
if [ "$balance" != "41.0000" ]; then
echo "frozen coinfrozen error balance=$balance"
exit 1
fi
echo "=========== # para chain node 1 quit ============="
hash=$(${PARA_CLI} send para node -o quit -a 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH -k 0xfdf2bbff853ecff2e7b86b2a8b45726c6538ca7d1403dc94e50131ef379bdca0)
id=$(${PARA_CLI} para node_status -a 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH -t user.p.para. | jq -r ".id")
if [ -z "${id}" ]; then
echo "wrong id "
${PARA_CLI} para node_status -t user.p.para. -a 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH
exit 1
fi
hash=$(${PARA_CLI} send para node -o 3 -i "$id" -k 0xfdf2bbff853ecff2e7b86b2a8b45726c6538ca7d1403dc94e50131ef379bdca0)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "29.0000" ]; then
if [ "$balance" != "33.0000" ]; then
echo "unfrozen coinfrozen error balance=$balance"
exit 1
fi
......@@ -569,45 +667,22 @@ function para_nodemanage_quit_test() {
para_nodemanage_node_join
echo "=========== # para chain node quit ============="
hash=$(${PARA_CLI} send para node -o quit -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
balance=$(${CLI} account balance -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -e paracross | jq -r ".frozen")
if [ "$balance" == "$PARA_COIN_FROZEN" ]; then
echo "unfrozen coinfrozen error balance=$balance"
exit 1
fi
status=$(${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY | jq -r ".status")
if [ "${status}" != "4" ]; then
echo "wrong vote status"
id=$(${PARA_CLI} para node_status -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -t user.p.para. | jq -r ".id")
if [ -z "${id}" ]; then
echo "wrong id "
${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY
exit 1
fi
}
function para_nodegroup_behalf_quit_test() {
echo "=========== # para chain behalf node quit ============="
hash=$(${PARA_CLI} send para node -o quit -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588)
hash=$(${PARA_CLI} send para node -o 3 -i "$id" -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
status=$(${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY | jq -r ".status")
if [ "${status}" != "3" ]; then
echo "wrong vote status"
${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY
balance=$(${CLI} account balance -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -e paracross | jq -r ".frozen")
if [ "$balance" == "$PARA_COIN_FROZEN" ]; then
echo "unfrozen coinfrozen error balance=$balance"
exit 1
fi
${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588
hash=$(${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
status=$(${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY | jq -r ".status")
if [ "${status}" != "4" ]; then
echo "wrong vote status"
......@@ -615,19 +690,6 @@ function para_nodegroup_behalf_quit_test() {
exit 1
fi
node=$(${PARA_CLI} para nodegroup_addrs -t user.p.para. | jq -r '.value|contains("1E5")')
if [ "${node}" == "true" ]; then
echo "wrong node group addr"
${PARA_CLI} para nodegroup_addrs -t user.p.para.
exit 1
fi
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "20.0000" ]; then
echo "unfrozen coinfrozen error balance=$balance"
exit 1
fi
}
function para_nodemanage_test() {
......@@ -635,9 +697,15 @@ function para_nodemanage_test() {
para_nodemanage_node_join
echo "=========== # para chain node vote ============="
${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
hash=$(${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
id=$(${PARA_CLI} para node_status -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -t user.p.para. | jq -r ".id")
if [ -z "${id}" ]; then
echo "wrong id "
${PARA_CLI} para node_status -t user.p.para. -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY
exit 1
fi
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
hash=$(${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
......@@ -656,11 +724,11 @@ function para_nodemanage_test() {
fi
echo "=========== # para chain node quit ============="
hash=$(${PARA_CLI} send para node -o quit -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588)
hash=$(${PARA_CLI} send para node -o 3 -i "$id" -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
status=$(${PARA_CLI} para node_list -t user.p.para. -s 3 | jq -r ".addrs[0].applyAddr")
status=$(${PARA_CLI} para node_list -t user.p.para. -s 3 | jq -r ".ids[0].targetAddr")
if [ "${status}" != "1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY" ]; then
echo "wrong join status"
${PARA_CLI} para node_list -t user.p.para. -s 3
......@@ -668,10 +736,10 @@ function para_nodemanage_test() {
fi
echo "=========== # para chain node vote quit ============="
${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588
hash=$(${PARA_CLI} send para node -o vote -a 1E5saiXVb9mW8wcWUUZjsHJPZs5GmdzuSY -v yes -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x9c451df9e5cb05b88b28729aeaaeb3169a2414097401fcb4c79c1971df734588
hash=$(${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
......@@ -697,10 +765,15 @@ function para_nodemanage_test() {
echo "=========== # para chain behalf node vote test ============="
para_nodemanage_node_behalf_join
${PARA_CLI} send para node -o vote -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -v yes -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o vote -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -v yes -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
hash=$(${PARA_CLI} send para node -o vote -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -v yes -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
id=$(${PARA_CLI} para node_status -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -t user.p.para. | jq -r ".id")
if [ -z "${id}" ]; then
echo "wrong id "
${PARA_CLI} para node_status -t user.p.para. -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB
exit 1
fi
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
hash=$(${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
......@@ -719,20 +792,20 @@ function para_nodemanage_test() {
fi
echo "=========== # para chain node quit ============="
hash=$(${PARA_CLI} send para node -o quit -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -k 0x794443611e7369a57b078881445b93b754cbc9b9b8f526535ab9c6d21d29203d)
hash=$(${PARA_CLI} send para node -o 3 -i "$id" -k 0x794443611e7369a57b078881445b93b754cbc9b9b8f526535ab9c6d21d29203d)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
echo "=========== # para chain node vote quit ============="
${PARA_CLI} send para node -o vote -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -v yes -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o vote -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -v yes -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
${PARA_CLI} send para node -o vote -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -v yes -k 0x794443611e7369a57b078881445b93b754cbc9b9b8f526535ab9c6d21d29203d
hash=$(${PARA_CLI} send para node -o vote -a 1NNaYHkscJaLJ2wUrFNeh6cQXBS4TrFYeB -v yes -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x6da92a632ab7deb67d38c0f6560bcfed28167998f6496db64c258d5e8393a81b
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x19c069234f9d3e61135fefbeb7791b149cdf6af536f26bebb310d4cd22c3fee4
${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x794443611e7369a57b078881445b93b754cbc9b9b8f526535ab9c6d21d29203d
hash=$(${PARA_CLI} send para node -o 2 -i "$id" -v 1 -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
echo "${hash}"
query_tx "${PARA_CLI}" "${hash}"
balance=$(${CLI} account balance -a 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj -e paracross | jq -r ".frozen")
if [ "$balance" != "20.0000" ]; then
if [ "$balance" != "24.0000" ]; then
echo "unfrozen coinfrozen error balance=$balance"
exit 1
fi
......@@ -754,6 +827,7 @@ function para_nodemanage_test() {
function para_test() {
echo "=========== # para chain test ============="
para_create_nodegroup
para_nodegroup_behalf_quit_test
para_nodemanage_test
token_create "${PARA_CLI}"
......@@ -771,7 +845,6 @@ function paracross() {
elif [ "${2}" == "test" ]; then
para_test "${1}"
dapp_rpc_test "${3}"
fi
if [ "${2}" == "forkInit" ]; then
......
......@@ -251,36 +251,25 @@ func CreateRawNodeManageCmd() *cobra.Command {
}
func addNodeManageFlags(cmd *cobra.Command) {
cmd.Flags().StringP("operation", "o", "", "operation:join,quit,vote")
cmd.Flags().Uint32P("operation", "o", 0, "operation:1:join,2:vote,3:quit")
cmd.MarkFlagRequired("operation")
cmd.Flags().StringP("addr", "a", "", "operating target addr")
cmd.MarkFlagRequired("addrs")
cmd.Flags().StringP("value", "v", "", "vote value: yes,no")
cmd.Flags().Float64P("coins_frozen", "c", 0, "join to frozen coins amount, not less config")
cmd.Flags().StringP("id", "i", "", "operating target id")
cmd.Flags().Uint32P("value", "v", 1, "vote value: 1:yes,2:no")
cmd.Flags().Float64P("coins_frozen", "c", 0, "frozen coins amount, should not less nodegroup's")
}
func createNodeTx(cmd *cobra.Command, args []string) {
op, _ := cmd.Flags().GetString("operation")
op, _ := cmd.Flags().GetUint32("operation")
opAddr, _ := cmd.Flags().GetString("addr")
val, _ := cmd.Flags().GetString("value")
id, _ := cmd.Flags().GetString("id")
val, _ := cmd.Flags().GetUint32("value")
coins, _ := cmd.Flags().GetFloat64("coins_frozen")
if op != "vote" && op != "quit" && op != "join" {
fmt.Println("operation should be one of join,quit,vote")
return
}
if opAddr == "" {
fmt.Println("addr parameter should not be null")
return
}
if op == "vote" && (val != "yes" && val != "no") {
fmt.Println("vote operation value parameter require yes or no value")
return
}
payload := &pt.ParaNodeAddrConfig{Op: op, Value: val, Addr: opAddr, CoinsFrozen: int64(math.Trunc((coins+0.0000001)*1e4)) * 1e4}
payload := &pt.ParaNodeAddrConfig{Op: op, Id: id, Value: val, Addr: opAddr, CoinsFrozen: int64(math.Trunc((coins+0.0000001)*1e4)) * 1e4}
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pt.ParaX),
ActionName: "NodeConfig",
......@@ -305,11 +294,12 @@ func CreateNodeGroupApplyCmd() *cobra.Command {
}
func addNodeGroupApplyCmdFlags(cmd *cobra.Command) {
cmd.Flags().Uint32P("operation", "o", 0, "operation:1:apply,2:approve,3:quit")
cmd.Flags().Uint32P("operation", "o", 0, "operation:1:apply,2:approve,3:quit,4:modify")
cmd.MarkFlagRequired("operation")
cmd.Flags().StringP("id", "i", "", "apply id for nodegroup ")
cmd.Flags().StringP("addrs", "a", "", "addrs apply for super node,split by ',' ")
cmd.MarkFlagRequired("addrs")
cmd.Flags().Float64P("coins_frozen", "c", 0, "coins amount to frozen, not less config")
......@@ -318,18 +308,10 @@ func addNodeGroupApplyCmdFlags(cmd *cobra.Command) {
func nodeGroupApply(cmd *cobra.Command, args []string) {
op, _ := cmd.Flags().GetUint32("operation")
addrs, _ := cmd.Flags().GetString("addrs")
id, _ := cmd.Flags().GetString("id")
coins, _ := cmd.Flags().GetFloat64("coins_frozen")
if op == 0 || op > 3 {
fmt.Println("operation should be one of 1:apply,2:approve,3:quit")
return
}
if addrs == "" {
fmt.Println("addrs should not be nil")
return
}
payload := &pt.ParaNodeGroupConfig{Op: op, Addrs: addrs, CoinsFrozen: int64(math.Trunc((coins+0.0000001)*1e4)) * 1e4}
payload := &pt.ParaNodeGroupConfig{Op: op, Id: id, Addrs: addrs, CoinsFrozen: int64(math.Trunc((coins+0.0000001)*1e4)) * 1e4}
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pt.ParaX),
ActionName: "NodeGroupConfig",
......@@ -486,7 +468,7 @@ func addNodeBodyCmdFlags(cmd *cobra.Command) {
cmd.MarkFlagRequired("title")
cmd.Flags().StringP("addr", "a", "", "addr apply for super user")
cmd.MarkFlagRequired("addr")
cmd.Flags().StringP("id", "i", "", "id apply for super user")
}
......@@ -494,12 +476,14 @@ func nodeInfo(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
title, _ := cmd.Flags().GetString("title")
addr, _ := cmd.Flags().GetString("addr")
id, _ := cmd.Flags().GetString("id")
params := pt.ReqParacrossNodeInfo{
Title: title,
Addr: addr,
Id: id,
}
var res pt.ParaNodeAddrStatus
var res pt.ParaNodeIdStatus
ctx := jsonclient.NewRPCCtx(rpcLaddr, "paracross.GetNodeStatus", params, &res)
ctx.Run()
}
......
......@@ -77,7 +77,7 @@ func getConfigManageNodes(db dbm.KV, title string) (map[string]struct{}, []strin
}
func getParacrossNodes(db dbm.KV, title string) (map[string]struct{}, []string, error) {
key := calcParaNodeGroupKey(title)
key := calcParaNodeGroupAddrsKey(title)
return getNodes(db, key)
}
......@@ -418,7 +418,12 @@ func (a *action) Commit(commit *pt.ParacrossCommitAction) (*types.Receipt, error
return receipt, nil
}
if enableParacrossTransfer && commit.Status.Height > 0 && len(commit.Status.CrossTxHashs) > 0 {
haveCrossTxs := len(commit.Status.CrossTxHashs) > 0
if commit.Status.Height > 0 && types.IsDappFork(commit.Status.MainBlockHeight, pt.ParaX, pt.ForkCommitTx) && commit.Status.CrossTxHashs[0] == nil {
haveCrossTxs = false
}
if enableParacrossTransfer && commit.Status.Height > 0 && haveCrossTxs {
clog.Debug("paracross.Commit commitDone", "do cross", "")
crossTxReceipt, err := a.execCrossTxs(commit)
if err != nil {
......@@ -459,10 +464,10 @@ func (a *action) execCrossTx(tx *types.TransactionDetail, commit *pt.ParacrossCo
}
func getCrossTxHashs(api client.QueueProtocolAPI, commit *pt.ParacrossCommitAction) ([][]byte, []byte, error) {
crossTxHashs := commit.Status.CrossTxHashs
crossTxResult := commit.Status.CrossTxResult
if types.IsDappFork(commit.Status.MainBlockHeight, pt.ParaX, pt.ForkCommitTx) {
if len(commit.Status.CrossTxHashs) == 0 {
clog.Error("getCrossTxHashs len=0", "paraHeight", commit.Status.Height,
"mainHeight", commit.Status.MainBlockHeight, "mainHash", hex.EncodeToString(commit.Status.MainBlockHash))
return nil, nil, types.ErrCheckTxHash
}
blockDetail, err := GetBlock(api, commit.Status.MainBlockHash)
......@@ -479,23 +484,32 @@ func getCrossTxHashs(api client.QueueProtocolAPI, commit *pt.ParacrossCommitActi
baseCheckTxHash := CalcTxHashsHash(baseHashs)
crossCheckHash := CalcTxHashsHash(paraCrossHashs)
if !bytes.Equal(commit.Status.CrossTxHashs[0], crossCheckHash) {
clog.Error("getCrossTxHashs para hash not equal", "main.crossHash", hex.EncodeToString(crossCheckHash),
clog.Error("getCrossTxHashs para hash not equal", "paraHeight", commit.Status.Height,
"mainHeight", commit.Status.MainBlockHeight, "mainHash", hex.EncodeToString(commit.Status.MainBlockHash),
"main.crossHash", hex.EncodeToString(crossCheckHash),
"commit.crossHash", hex.EncodeToString(commit.Status.CrossTxHashs[0]),
"main.baseHash", hex.EncodeToString(baseCheckTxHash), "commit.baseHash", hex.EncodeToString(commit.Status.TxHashs[0]))
for _, hash := range baseHashs {
clog.Error("getCrossTxHashs base tx hash", "txhash", hex.EncodeToString(hash))
}
for _, hash := range paraCrossHashs {
clog.Error("getCrossTxHashs paracross tx hash", "txhash", hex.EncodeToString(hash))
}
return nil, nil, types.ErrCheckTxHash
}
//只获取跨链tx
crossTxHashs = paraCrossHashs
rst, err := hex.DecodeString(string(commit.Status.CrossTxResult))
if err != nil {
clog.Error("getCrossTxHashs decode string", "CrossTxResult", string(commit.Status.CrossTxResult),
"commit.height", commit.Status.Height)
return nil, nil, types.ErrInvalidParam
}
crossTxResult = rst
return paraCrossHashs, rst, nil
}
return crossTxHashs, crossTxResult, nil
return commit.Status.CrossTxHashs, commit.Status.CrossTxResult, nil
}
func (a *action) execCrossTxs(commit *pt.ParacrossCommitAction) (*types.Receipt, error) {
......
......@@ -64,11 +64,11 @@ func (e *Paracross) ExecDelLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *
}
if g.Prev != nil {
set.KV = append(set.KV, &types.KeyValue{
Key: calcLocalNodeTitleStatus(g.Current.Title, g.Current.ApplyAddr, g.Prev.Status), Value: types.Encode(g.Prev)})
Key: calcLocalNodeTitleStatus(g.Current.Title, g.Prev.Status, g.Prev.Id), Value: types.Encode(g.Prev)})
}
set.KV = append(set.KV, &types.KeyValue{
Key: calcLocalNodeTitleStatus(g.Current.Title, g.Current.ApplyAddr, g.Current.Status), Value: nil})
Key: calcLocalNodeTitleStatus(g.Current.Title, g.Current.Status, g.Current.Id), Value: nil})
} else if log.Ty == pt.TyLogParaNodeVoteDone {
var g pt.ReceiptParaNodeVoteDone
err := types.Decode(log.Log, &g)
......@@ -86,8 +86,7 @@ func (e *Paracross) ExecDelLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *
func (e *Paracross) ExecDelLocal_NodeGroupConfig(payload *pt.ParaNodeGroupConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
var set types.LocalDBSet
for _, log := range receiptData.Logs {
if log.Ty == pt.TyLogParaNodeGroupApply || log.Ty == pt.TyLogParaNodeGroupApprove ||
log.Ty == pt.TyLogParaNodeGroupQuit {
if log.Ty == pt.TyLogParaNodeGroupConfig {
var g pt.ReceiptParaNodeGroupConfig
err := types.Decode(log.Log, &g)
if err != nil {
......@@ -95,11 +94,11 @@ func (e *Paracross) ExecDelLocal_NodeGroupConfig(payload *pt.ParaNodeGroupConfig
}
if g.Prev != nil {
set.KV = append(set.KV, &types.KeyValue{
Key: calcLocalNodeGroupStatusTitle(g.Prev.Status, g.Current.Title), Value: types.Encode(g.Prev)})
Key: calcLocalNodeGroupStatusTitle(g.Prev.Status, g.Current.Title, g.Current.Id), Value: types.Encode(g.Prev)})
}
set.KV = append(set.KV, &types.KeyValue{
Key: calcLocalNodeGroupStatusTitle(g.Current.Status, g.Current.Title), Value: nil})
Key: calcLocalNodeGroupStatusTitle(g.Current.Status, g.Current.Title, g.Current.Id), Value: nil})
}
}
return &set, nil
......
......@@ -67,11 +67,11 @@ func (e *Paracross) ExecLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *typ
}
if g.Prev != nil {
set.KV = append(set.KV, &types.KeyValue{
Key: calcLocalNodeTitleStatus(g.Current.Title, g.Current.ApplyAddr, g.Prev.Status), Value: nil})
Key: calcLocalNodeTitleStatus(g.Current.Title, g.Prev.Status, g.Current.Id), Value: nil})
}
set.KV = append(set.KV, &types.KeyValue{
Key: calcLocalNodeTitleStatus(g.Current.Title, g.Current.ApplyAddr, g.Current.Status),
Key: calcLocalNodeTitleStatus(g.Current.Title, g.Current.Status, g.Current.Id),
Value: types.Encode(g.Current)})
} else if log.Ty == pt.TyLogParaNodeVoteDone {
var g pt.ReceiptParaNodeVoteDone
......@@ -90,8 +90,7 @@ func (e *Paracross) ExecLocal_NodeConfig(payload *pt.ParaNodeAddrConfig, tx *typ
func (e *Paracross) ExecLocal_NodeGroupConfig(payload *pt.ParaNodeGroupConfig, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
var set types.LocalDBSet
for _, log := range receiptData.Logs {
if log.Ty == pt.TyLogParaNodeGroupApply || log.Ty == pt.TyLogParaNodeGroupApprove ||
log.Ty == pt.TyLogParaNodeGroupQuit {
if log.Ty == pt.TyLogParaNodeGroupConfig {
var g pt.ReceiptParaNodeGroupConfig
err := types.Decode(log.Log, &g)
if err != nil {
......@@ -99,11 +98,11 @@ func (e *Paracross) ExecLocal_NodeGroupConfig(payload *pt.ParaNodeGroupConfig, t
}
if g.Prev != nil {
set.KV = append(set.KV, &types.KeyValue{
Key: calcLocalNodeGroupStatusTitle(g.Prev.Status, g.Current.Title), Value: nil})
Key: calcLocalNodeGroupStatusTitle(g.Prev.Status, g.Current.Title, g.Current.Id), Value: nil})
}
set.KV = append(set.KV, &types.KeyValue{
Key: calcLocalNodeGroupStatusTitle(g.Current.Status, g.Current.Title), Value: types.Encode(g.Current)})
Key: calcLocalNodeGroupStatusTitle(g.Current.Status, g.Current.Title, g.Current.Id), Value: types.Encode(g.Current)})
}
}
return &set, nil
......
......@@ -16,7 +16,9 @@ var (
managerConfigNodes string //manager 合约配置的nodes
paraConfigNodes string //平行链自组织配置的nodes,最初是从manager同步过来
paraConfigNodeAddr string //平行链配置节点账户
paraNodeGroupApplyAddrs string
paraNodeGroupStatusAddrs string //正在申请的addrs
paraNodeID string
paraNodeGroupID string
localTx string
localTitle string
localTitleHeight string
......@@ -32,7 +34,9 @@ func setPrefix() {
managerConfigNodes = "paracross-nodes-"
paraConfigNodes = "mavl-paracross-nodes-title-"
paraConfigNodeAddr = "mavl-paracross-nodes-titleAddr-"
paraNodeGroupApplyAddrs = "mavl-paracross-nodegroup-apply-title-"
paraNodeGroupStatusAddrs = "mavl-paracross-nodegroup-apply-title-"
paraNodeID = "mavl-paracross-title-nodeid-"
paraNodeGroupID = "mavl-paracross-title-nodegroupid-"
localTx = "LODB-paracross-titleHeightAddr-"
localTitle = "LODB-paracross-title-"
localTitleHeight = "LODB-paracross-titleHeight-"
......@@ -62,7 +66,7 @@ func calcManageConfigNodesKey(title string) []byte {
return []byte(types.ManageKey(key))
}
func calcParaNodeGroupKey(title string) []byte {
func calcParaNodeGroupAddrsKey(title string) []byte {
return []byte(fmt.Sprintf(paraConfigNodes+"%s", title))
}
......@@ -70,8 +74,16 @@ func calcParaNodeAddrKey(title string, addr string) []byte {
return []byte(fmt.Sprintf(paraConfigNodeAddr+"%s-%s", title, addr))
}
func calcParaNodeGroupApplyKey(title string) []byte {
return []byte(fmt.Sprintf(paraNodeGroupApplyAddrs+"%s", title))
func calcParaNodeGroupStatusKey(title string) []byte {
return []byte(fmt.Sprintf(paraNodeGroupStatusAddrs+"%s", title))
}
func calcParaNodeIDKey(title, hash string) string {
return fmt.Sprintf(paraNodeID+"%s-%s", title, hash)
}
func calcParaNodeGroupIDKey(title, hash string) string {
return fmt.Sprintf(paraNodeGroupID+"%s-%s", title, hash)
}
func calcLocalTxKey(title string, height int64, addr string) []byte {
......@@ -90,22 +102,30 @@ func calcLocalAssetKey(hash []byte) []byte {
return []byte(fmt.Sprintf(localAssetKey+"%s", hash))
}
func calcLocalNodeTitleStatus(title, addr string, status int32) []byte {
return []byte(fmt.Sprintf(localNodeTitleStatus+"%s-%02d-%s", title, status, addr))
func calcLocalNodeTitleStatus(title string, status int32, id string) []byte {
return []byte(fmt.Sprintf(localNodeTitleStatus+"%s-%02d-%s", title, status, id))
}
func calcLocalNodeStatusPrefix(title string, status int32) []byte {
return []byte(fmt.Sprintf(localNodeTitleStatus+"%s-%02d", title, status))
return []byte(fmt.Sprintf(localNodeTitleStatus+"%s-%02d-", title, status))
}
func calcLocalNodeTitlePrefix(title string) []byte {
return []byte(fmt.Sprintf(localNodeTitleStatus+"%s-", title))
}
func calcLocalNodeTitleDone(title, addr string) []byte {
return []byte(fmt.Sprintf(localNodeTitleDone+"%s-%s", title, addr))
}
func calcLocalNodeGroupStatusTitle(status int32, title string) []byte {
return []byte(fmt.Sprintf(localNodeGroupStatusTitle+"%02d-%s", status, title))
func calcLocalNodeGroupStatusTitle(status int32, title, id string) []byte {
return []byte(fmt.Sprintf(localNodeGroupStatusTitle+"%02d-%s-%s", status, title, id))
}
func calcLocalNodeGroupStatusPrefix(status int32) []byte {
return []byte(fmt.Sprintf(localNodeGroupStatusTitle+"%02d", status))
return []byte(fmt.Sprintf(localNodeGroupStatusTitle+"%02d-", status))
}
func calcLocalNodeGroupAllPrefix() []byte {
return []byte(fmt.Sprintf(localNodeGroupStatusTitle))
}
......@@ -75,7 +75,7 @@ func (p *Paracross) Query_GetNodeGroupAddrs(in *pt.ReqParacrossNodeInfo) (types.
nodes = append(nodes, k)
}
var reply types.ReplyConfig
reply.Key = string(calcParaNodeGroupKey(in.GetTitle()))
reply.Key = string(calcParaNodeGroupAddrsKey(in.GetTitle()))
reply.Value = fmt.Sprint(nodes)
return &reply, nil
}
......@@ -85,7 +85,24 @@ func (p *Paracross) Query_GetNodeAddrInfo(in *pt.ReqParacrossNodeInfo) (types.Me
if in == nil || in.Title == "" || in.Addr == "" {
return nil, types.ErrInvalidParam
}
stat, err := getNodeAddr(p.GetStateDB(), in.Title, in.Addr)
addrStat, err := getNodeAddr(p.GetStateDB(), in.Title, in.Addr)
if err != nil {
return nil, err
}
stat, err := getNodeID(p.GetStateDB(), addrStat.ProposalId)
if err != nil {
return nil, err
}
return stat, nil
}
//Query_GetNodeIdInfo get specific node addr info
func (p *Paracross) Query_GetNodeIdInfo(in *pt.ReqParacrossNodeInfo) (types.Message, error) {
if in == nil || in.Title == "" || in.Id == "" {
return nil, types.ErrInvalidParam
}
stat, err := getNodeID(p.GetStateDB(), in.Id)
if err != nil {
return nil, err
}
......@@ -114,7 +131,7 @@ func (p *Paracross) Query_GetNodeGroupStatus(in *pt.ReqParacrossNodeInfo) (types
//Query_ListNodeGroupStatus list node info by status
func (p *Paracross) Query_ListNodeGroupStatus(in *pt.ReqParacrossNodeInfo) (types.Message, error) {
if in == nil || in.Status == 0 {
if in == nil {
return nil, types.ErrInvalidParam
}
return listLocalNodeGroupStatus(p.GetLocalDB(), in.Status)
......@@ -212,7 +229,7 @@ func listLocalTitles(db dbm.KVDB) (types.Message, error) {
MostSameCommit: st.MostSameCommit,
Title: st.Title,
Height: st.Height,
StateHash: hex.EncodeToString(st.StateHash),
StateHash: common.ToHex(st.StateHash),
TxCounts: st.TxCounts,
TxResult: hex.EncodeToString(st.TxResult),
}
......@@ -230,12 +247,12 @@ func listNodeStatus(db dbm.KVDB, prefix []byte) (types.Message, error) {
var resp pt.RespParacrossNodeAddrs
for _, r := range res {
var st pt.ParaNodeAddrStatus
var st pt.ParaNodeIdStatus
err = types.Decode(r, &st)
if err != nil {
panic(err)
}
resp.Addrs = append(resp.Addrs, &st)
resp.Ids = append(resp.Ids, &st)
}
return &resp, nil
}
......@@ -253,19 +270,31 @@ func listNodeGroupStatus(db dbm.KVDB, prefix []byte) (types.Message, error) {
if err != nil {
panic(err)
}
resp.Addrs = append(resp.Addrs, &st)
resp.Ids = append(resp.Ids, &st)
}
return &resp, nil
}
//按状态遍历
func listLocalNodeStatus(db dbm.KVDB, title string, status int32) (types.Message, error) {
prefix := calcLocalNodeStatusPrefix(title, status)
var prefix []byte
if status == 0 {
prefix = calcLocalNodeTitlePrefix(title)
} else {
prefix = calcLocalNodeStatusPrefix(title, status)
}
return listNodeStatus(db, prefix)
}
func listLocalNodeGroupStatus(db dbm.KVDB, status int32) (types.Message, error) {
prefix := calcLocalNodeGroupStatusPrefix(status)
var prefix []byte
if status == 0 {
prefix = calcLocalNodeGroupAllPrefix()
} else {
prefix = calcLocalNodeGroupStatusPrefix(status)
}
return listNodeGroupStatus(db, prefix)
}
......@@ -287,7 +316,7 @@ func loadLocalTitle(db dbm.KV, title string, height int64) (types.Message, error
MostSameCommit: st.MostSameCommit,
Title: st.Title,
Height: st.Height,
StateHash: hex.EncodeToString(st.StateHash),
StateHash: common.ToHex(st.StateHash),
TxCounts: st.TxCounts,
TxResult: hex.EncodeToString(st.TxResult),
}, nil
......
......@@ -62,8 +62,10 @@ func getMiners(detail *pt.ParacrossStatusDetails, blockHash []byte) []string {
//
func mergeReceipt(receipt1, receipt2 *types.Receipt) *types.Receipt {
if receipt2 != nil {
receipt1.KV = append(receipt1.KV, receipt2.KV...)
receipt1.Logs = append(receipt1.Logs, receipt2.Logs...)
}
receipt1.KV = append(receipt1.KV, receipt2.KV...)
receipt1.Logs = append(receipt1.Logs, receipt2.Logs...)
return receipt1
}
......@@ -10,6 +10,9 @@ import (
"strings"
"strconv"
"github.com/33cn/chain33/common"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/system/dapp"
manager "github.com/33cn/chain33/system/dapp/manage/types"
......@@ -31,20 +34,31 @@ func deepCopy(dst, src interface{}) error {
return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
}
func getNodeAddr(db dbm.KV, title, addr string) (*pt.ParaNodeAddrStatus, error) {
func getNodeAddr(db dbm.KV, title, addr string) (*pt.ParaNodeAddrIdStatus, error) {
key := calcParaNodeAddrKey(title, addr)
val, err := db.Get(key)
if err != nil {
return nil, err
}
var status pt.ParaNodeAddrStatus
var status pt.ParaNodeAddrIdStatus
err = types.Decode(val, &status)
return &status, err
}
func getNodeID(db dbm.KV, id string) (*pt.ParaNodeIdStatus, error) {
val, err := getDb(db, []byte(id))
if err != nil {
return nil, err
}
var status pt.ParaNodeIdStatus
err = types.Decode(val, &status)
return &status, err
}
func getNodeGroupStatus(db dbm.KV, title string) (*pt.ParaNodeGroupStatus, error) {
key := calcParaNodeGroupApplyKey(title)
key := calcParaNodeGroupStatusKey(title)
val, err := db.Get(key)
if err != nil {
return nil, err
......@@ -55,25 +69,29 @@ func getNodeGroupStatus(db dbm.KV, title string) (*pt.ParaNodeGroupStatus, error
return &status, err
}
func saveDb(db dbm.KV, key []byte, status types.Message) error {
val := types.Encode(status)
return db.Set(key, val)
func getDb(db dbm.KV, key []byte) ([]byte, error) {
val, err := db.Get(key)
if err != nil {
return nil, err
}
return val, nil
}
func saveNodeAddr(db dbm.KV, title, addr string, status types.Message) error {
key := calcParaNodeAddrKey(title, addr)
return saveDb(db, key, status)
}
func getNodeGroupID(db dbm.KV, id string) (*pt.ParaNodeGroupStatus, error) {
val, err := getDb(db, []byte(id))
if err != nil {
return nil, err
}
func saveNodeGroup(db dbm.KV, title string, status types.Message) error {
key := calcParaNodeGroupApplyKey(title)
return saveDb(db, key, status)
var status pt.ParaNodeGroupStatus
err = types.Decode(val, &status)
return &status, err
}
func makeVoteDoneReceipt(config *pt.ParaNodeAddrConfig, totalCount, commitCount, most int, pass string, status int32) *types.Receipt {
func makeVoteDoneReceipt(config *pt.ParaNodeIdStatus, totalCount, commitCount, most int, pass string, status int32) *types.Receipt {
log := &pt.ReceiptParaNodeVoteDone{
Title: config.Title,
TargetAddr: config.Addr,
TargetAddr: config.TargetAddr,
TotalNodes: int32(totalCount),
TotalVote: int32(commitCount),
MostVote: int32(most),
......@@ -93,10 +111,11 @@ func makeVoteDoneReceipt(config *pt.ParaNodeAddrConfig, totalCount, commitCount,
}
}
func makeNodeConfigReceipt(addr string, config *pt.ParaNodeAddrConfig, prev, current *pt.ParaNodeAddrStatus) *types.Receipt {
key := calcParaNodeAddrKey(config.Title, config.Addr)
func makeNodeConfigReceipt(fromAddr string, config *pt.ParaNodeAddrConfig, prev, current *pt.ParaNodeIdStatus) *types.Receipt {
key := calcParaNodeAddrKey(current.Title, current.TargetAddr)
val := &pt.ParaNodeAddrIdStatus{ProposalId: current.Id}
log := &pt.ReceiptParaNodeConfig{
Addr: addr,
Addr: fromAddr,
Config: config,
Prev: prev,
Current: current,
......@@ -104,7 +123,8 @@ func makeNodeConfigReceipt(addr string, config *pt.ParaNodeAddrConfig, prev, cur
return &types.Receipt{
Ty: types.ExecOk,
KV: []*types.KeyValue{
{Key: key, Value: types.Encode(current)},
{Key: []byte(current.Id), Value: types.Encode(current)},
{Key: key, Value: types.Encode(val)},
},
Logs: []*types.ReceiptLog{
{
......@@ -115,8 +135,28 @@ func makeNodeConfigReceipt(addr string, config *pt.ParaNodeAddrConfig, prev, cur
}
}
func makeParaNodeGroupApplyReiceipt(title, addr string, prev, current *pt.ParaNodeGroupStatus, logTy int32) *types.Receipt {
key := calcParaNodeGroupApplyKey(title)
func makeNodeGroupIDReceipt(addr string, prev, current *pt.ParaNodeGroupStatus) *types.Receipt {
log := &pt.ReceiptParaNodeGroupConfig{
Addr: addr,
Prev: prev,
Current: current,
}
return &types.Receipt{
Ty: types.ExecOk,
KV: []*types.KeyValue{
{Key: []byte(current.Id), Value: types.Encode(current)},
},
Logs: []*types.ReceiptLog{
{
Ty: pt.TyLogParaNodeGroupConfig,
Log: types.Encode(log),
},
},
}
}
func makeParaNodeGroupStatusReceipt(title string, addr string, prev, current *pt.ParaNodeGroupStatus) *types.Receipt {
key := calcParaNodeGroupStatusKey(title)
log := &pt.ReceiptParaNodeGroupConfig{
Addr: addr,
Prev: prev,
......@@ -129,15 +169,15 @@ func makeParaNodeGroupApplyReiceipt(title, addr string, prev, current *pt.ParaNo
},
Logs: []*types.ReceiptLog{
{
Ty: logTy,
Ty: pt.TyLogParaNodeGroupStatusUpdate,
Log: types.Encode(log),
},
},
}
}
func makeParaNodeGroupReiceipt(title string, prev, current *types.ConfigItem) *types.Receipt {
key := calcParaNodeGroupKey(title)
func makeParaNodeGroupReceipt(title string, prev, current *types.ConfigItem) *types.Receipt {
key := calcParaNodeGroupAddrsKey(title)
log := &types.ReceiptConfig{Prev: prev, Current: current}
return &types.Receipt{
Ty: types.ExecOk,
......@@ -146,7 +186,7 @@ func makeParaNodeGroupReiceipt(title string, prev, current *types.ConfigItem) *t
},
Logs: []*types.ReceiptLog{
{
Ty: pt.TyLogParaNodeGroupUpdate,
Ty: pt.TyLogParaNodeGroupAddrsUpdate,
Log: types.Encode(log),
},
},
......@@ -169,8 +209,6 @@ func (a *action) nodeJoin(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
}
if config.CoinsFrozen < nodeGroupStatus.CoinsFrozen {
clog.Error("nodeJoin coinfrozen not enough", "title", config.Title, "addr", config.Addr,
"config", config.CoinsFrozen, "nodegroupConfig", nodeGroupStatus.CoinsFrozen)
return nil, errors.Wrapf(pt.ErrParaNodeGroupFrozenCoinsNotEnough,
"coinFrozen not enough:%d,expected:%d", config.CoinsFrozen, nodeGroupStatus.CoinsFrozen)
}
......@@ -185,114 +223,116 @@ func (a *action) nodeJoin(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
receipt.Logs = append(receipt.Logs, r.Logs...)
}
stat, err := getNodeAddr(a.db, config.Title, config.Addr)
addrStat, err := getNodeAddr(a.db, config.Title, config.Addr)
if err != nil {
if !isNotFound(err) {
return nil, err
}
clog.Info("first time add node addr", "title", config.Title, "addr", config.Addr)
stat := &pt.ParaNodeAddrStatus{Status: pt.ParacrossNodeAdding,
stat := &pt.ParaNodeIdStatus{
Id: calcParaNodeIDKey(config.Title, common.ToHex(a.txhash)),
Status: pt.ParacrossNodeJoining,
Title: config.Title,
ApplyAddr: config.Addr,
TargetAddr: config.Addr,
FromAddr: a.fromaddr,
Votes: &pt.ParaNodeVoteDetail{},
CoinsFrozen: config.CoinsFrozen}
saveNodeAddr(a.db, config.Title, config.Addr, stat)
CoinsFrozen: config.CoinsFrozen,
Height: a.height}
r := makeNodeConfigReceipt(a.fromaddr, config, nil, stat)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
return receipt, nil
}
var copyStat pt.ParaNodeAddrStatus
stat, err := getNodeID(a.db, addrStat.ProposalId)
if err != nil {
clog.Error("nodeaccount.getNodeID fail", "err", err.Error())
return nil, err
}
var copyStat pt.ParaNodeIdStatus
err = deepCopy(&copyStat, stat)
if err != nil {
clog.Error("nodeaccount.nodeJoin deep copy fail", "copy", copyStat, "stat", stat)
return nil, err
}
if stat.Status != pt.ParacrossNodeQuited {
clog.Error("nodeaccount.nodeJoin key exist", "addr", config.Addr, "status", stat)
return nil, pt.ErrParaNodeAddrExisted
}
stat = &pt.ParaNodeAddrStatus{
Status: pt.ParacrossNodeAdding,
Title: config.Title,
ApplyAddr: config.Addr,
FromAddr: a.fromaddr,
Votes: &pt.ParaNodeVoteDetail{},
CoinsFrozen: config.CoinsFrozen}
saveNodeAddr(a.db, config.Title, config.Addr, stat)
r := makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
return receipt, nil
if stat.Status == pt.ParacrossNodeQuited {
stat = &pt.ParaNodeIdStatus{
Id: calcParaNodeIDKey(config.Title, common.ToHex(a.txhash)),
Status: pt.ParacrossNodeJoining,
Title: config.Title,
TargetAddr: config.Addr,
FromAddr: a.fromaddr,
Votes: &pt.ParaNodeVoteDetail{},
CoinsFrozen: config.CoinsFrozen,
Height: a.height}
r := makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
return receipt, nil
}
return nil, errors.Wrapf(pt.ErrParaNodeAddrExisted, "nodeAddr existed:%s,status:%d", config.Addr, stat.Status)
}
func (a *action) nodeQuit(config *pt.ParaNodeAddrConfig) (*types.Receipt, error) {
stat, err := getNodeAddr(a.db, config.Title, config.Addr)
stat, err := getNodeID(a.db, config.Id)
if err != nil {
return nil, err
}
//代替别人退出或者自己退出都允许,但代替别人退出时候创建账户也必须匹配
if a.fromaddr != stat.FromAddr && a.fromaddr != config.Addr {
clog.Error("nodeaccount.nodeQuit wrong addr", "createAddr", stat.FromAddr, "confAddr", config.Addr, "fromAddr", a.fromaddr)
return nil, types.ErrNotAllow
if config.Title != stat.Title {
return nil, errors.Wrapf(pt.ErrNodeNotForTheTitle, "config title:%s,id title:%s", config.Title, stat.Title)
}
if stat.Status == pt.ParacrossNodeQuiting || stat.Status == pt.ParacrossNodeQuited {
clog.Error("nodeaccount.nodeQuit wrong status", "status", stat)
return nil, errors.Wrapf(pt.ErrParaUnSupportNodeOper, "nodeAddr %s was quit status:%d", config.Addr, stat.Status)
var copyStat pt.ParaNodeIdStatus
err = deepCopy(&copyStat, stat)
if err != nil {
clog.Error("nodeaccount.nodeQuit deep copy fail", "copy", copyStat, "stat", stat)
return nil, err
}
if stat.Status == pt.ParacrossNodeAdded {
if stat.Status == pt.ParacrossNodeJoined {
nodes, _, err := getParacrossNodes(a.db, config.Title)
if err != nil {
return nil, errors.Wrapf(err, "getNodes for title:%s", config.Title)
}
if !validNode(config.Addr, nodes) {
return nil, errors.Wrapf(pt.ErrParaNodeAddrNotExisted, "nodeAddr not existed:%s", config.Addr)
if !validNode(stat.TargetAddr, nodes) {
return nil, errors.Wrapf(pt.ErrParaNodeAddrNotExisted, "nodeAddr not existed:%s", stat.TargetAddr)
}
//不允许最后一个账户退出
if len(nodes) == 1 {
return nil, errors.Wrapf(pt.ErrParaNodeGroupLastAddr, "nodeAddr last one:%s", config.Addr)
return nil, errors.Wrapf(pt.ErrParaNodeGroupLastAddr, "nodeAddr last one:%s", stat.TargetAddr)
}
}
var copyStat pt.ParaNodeAddrStatus
err = deepCopy(&copyStat, stat)
if err != nil {
clog.Error("nodeaccount.nodeQuit deep copy fail", "copy", copyStat, "stat", stat)
return nil, err
}
if stat.Status == pt.ParacrossNodeAdded {
stat.Status = pt.ParacrossNodeQuiting
stat.Height = a.height
stat.Votes = &pt.ParaNodeVoteDetail{}
saveNodeAddr(a.db, config.Title, config.Addr, stat)
return makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat), nil
}
//still adding status, quit directly
receipt := &types.Receipt{Ty: types.ExecOk}
if !types.IsPara() {
r, err := a.nodeGroupCoinsActive(stat.FromAddr, stat.CoinsFrozen, 1)
if err != nil {
return nil, err
if stat.Status == pt.ParacrossNodeJoining {
//still adding status, quit directly
receipt := &types.Receipt{Ty: types.ExecOk}
if !types.IsPara() {
r, err := a.nodeGroupCoinsActive(stat.FromAddr, stat.CoinsFrozen, 1)
if err != nil {
return nil, err
}
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
}
stat.Status = pt.ParacrossNodeQuited
stat.Height = a.height
stat.Votes = &pt.ParaNodeVoteDetail{}
r := makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
}
stat.Status = pt.ParacrossNodeQuited
stat.Votes = &pt.ParaNodeVoteDetail{}
saveNodeAddr(a.db, config.Title, config.Addr, stat)
r := makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
return receipt, nil
}
return receipt, nil
return nil, errors.Wrapf(pt.ErrParaUnSupportNodeOper, "nodeid %s was quit status:%d", config.Id, stat.Status)
}
......@@ -306,10 +346,10 @@ func isSuperManager(addr string) bool {
return false
}
func getMostVote(stat *pt.ParaNodeAddrStatus) (int, string) {
func getMostVote(stat *pt.ParaNodeIdStatus) (int, int) {
var ok, nok int
for _, v := range stat.GetVotes().Votes {
if v == pt.ParaNodeVoteYes {
if v == pt.ParaNodeVoteStr[pt.ParaNodeVoteYes] {
ok++
} else {
nok++
......@@ -332,9 +372,7 @@ func (a *action) superManagerVoteProc(title string) error {
if err != nil {
return err
}
if status.Status != pt.ParacrossNodeGroupApprove {
return pt.ErrParaNodeGroupStatusWrong
}
confStopBlocks := conf.GInt("paraConsensusStopBlocks")
data, err := a.exec.paracrossGetHeight(title)
if err != nil {
......@@ -373,12 +411,16 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
return nil, errors.Wrapf(pt.ErrNodeNotForTheTitle, "not validNode:%s", a.fromaddr)
}
stat, err := getNodeAddr(a.db, config.Title, config.Addr)
stat, err := getNodeID(a.db, config.Id)
if err != nil {
return nil, err
}
var copyStat pt.ParaNodeAddrStatus
if config.Title != stat.Title {
return nil, errors.Wrapf(pt.ErrNodeNotForTheTitle, "config title:%s,id title:%s", config.Title, stat.Title)
}
var copyStat pt.ParaNodeIdStatus
err = deepCopy(&copyStat, stat)
if err != nil {
clog.Error("nodeaccount.nodevOTE deep copy fail", "copy", copyStat, "stat", stat)
......@@ -390,10 +432,10 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
}
found, index := hasVoted(stat.Votes.Addrs, a.fromaddr)
if found {
stat.Votes.Votes[index] = config.Value
stat.Votes.Votes[index] = pt.ParaNodeVoteStr[config.Value]
} else {
stat.Votes.Addrs = append(stat.Votes.Addrs, a.fromaddr)
stat.Votes.Votes = append(stat.Votes.Votes, config.Value)
stat.Votes.Votes = append(stat.Votes.Votes, pt.ParaNodeVoteStr[config.Value])
}
most, vote := getMostVote(stat)
if !isCommitDone(stat, nodes, most) {
......@@ -411,63 +453,62 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
//超级用户投yes票,共识停止了一定高度就可以通过,防止当前所有授权节点都忘掉私钥场景
if !(superManagerPass && most > 0 && vote == pt.ParaNodeVoteYes) {
saveNodeAddr(a.db, config.Title, config.Addr, stat)
return makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat), nil
}
}
clog.Info("paracross.nodeVote ----pass", "most", most, "pass", vote)
var receiptGroup *types.Receipt
receipt := &types.Receipt{Ty: types.ExecOk}
if vote == pt.ParaNodeVoteNo {
// 对已经在group里面的node,直接投票remove,对正在申请中的adding or quiting状态保持不变,对quited的保持不变
if stat.Status == pt.ParacrossNodeAdded {
receiptGroup, err = unpdateNodeGroup(a.db, config.Title, config.Addr, false)
if stat.Status == pt.ParacrossNodeJoined {
r, err := unpdateNodeGroup(a.db, config.Title, stat.TargetAddr, false)
if err != nil {
return nil, err
}
receipt = mergeReceipt(receipt, r)
stat.Status = pt.ParacrossNodeQuited
stat.Height = a.height
if !types.IsPara() {
r, err := a.nodeGroupCoinsActive(stat.FromAddr, stat.CoinsFrozen, 1)
if err != nil {
return nil, err
}
receiptGroup.KV = append(receiptGroup.KV, r.KV...)
receiptGroup.Logs = append(receiptGroup.Logs, r.Logs...)
receipt = mergeReceipt(receipt, r)
}
}
} else {
if stat.Status == pt.ParacrossNodeAdding {
receiptGroup, err = unpdateNodeGroup(a.db, config.Title, config.Addr, true)
if stat.Status == pt.ParacrossNodeJoining {
r, err := unpdateNodeGroup(a.db, config.Title, stat.TargetAddr, true)
if err != nil {
return nil, err
}
stat.Status = pt.ParacrossNodeAdded
stat.Status = pt.ParacrossNodeJoined
stat.Height = a.height
receipt = mergeReceipt(receipt, r)
} else if stat.Status == pt.ParacrossNodeQuiting {
receiptGroup, err = unpdateNodeGroup(a.db, config.Title, config.Addr, false)
r, err := unpdateNodeGroup(a.db, config.Title, stat.TargetAddr, false)
if err != nil {
return nil, err
}
stat.Status = pt.ParacrossNodeQuited
stat.Height = a.height
receipt = mergeReceipt(receipt, r)
if !types.IsPara() {
r, err := a.nodeGroupCoinsActive(stat.FromAddr, stat.CoinsFrozen, 1)
if err != nil {
return nil, err
}
receiptGroup.KV = append(receiptGroup.KV, r.KV...)
receiptGroup.Logs = append(receiptGroup.Logs, r.Logs...)
receipt = mergeReceipt(receipt, r)
}
}
}
saveNodeAddr(a.db, config.Title, config.Addr, stat)
receipt := makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat)
if receiptGroup != nil {
receipt.KV = append(receipt.KV, receiptGroup.KV...)
receipt.Logs = append(receipt.Logs, receiptGroup.Logs...)
}
receiptDone := makeVoteDoneReceipt(config, len(nodes), len(stat.Votes.Addrs), most, vote, stat.Status)
receipt.KV = append(receipt.KV, receiptDone.KV...)
receipt.Logs = append(receipt.Logs, receiptDone.Logs...)
r := makeNodeConfigReceipt(a.fromaddr, config, &copyStat, stat)
receipt = mergeReceipt(receipt, r)
receiptDone := makeVoteDoneReceipt(stat, len(nodes), len(stat.Votes.Addrs), most, pt.ParaNodeVoteStr[vote], stat.Status)
receipt = mergeReceipt(receipt, receiptDone)
return receipt, nil
}
......@@ -475,7 +516,7 @@ func (a *action) nodeVote(config *pt.ParaNodeAddrConfig) (*types.Receipt, error)
func unpdateNodeGroup(db dbm.KV, title, addr string, add bool) (*types.Receipt, error) {
var item types.ConfigItem
key := calcParaNodeGroupKey(title)
key := calcParaNodeGroupAddrsKey(title)
value, err := db.Get(key)
if err != nil {
return nil, err
......@@ -512,18 +553,10 @@ func unpdateNodeGroup(db dbm.KV, title, addr string, add bool) (*types.Receipt,
}
}
return makeParaNodeGroupReiceipt(title, &copyItem, &item), nil
}
func (a *action) checkConfig(title string) error {
if !validTitle(title) {
return pt.ErrInvalidTitle
}
return nil
return makeParaNodeGroupReceipt(title, &copyItem, &item), nil
}
func getAddrGroup(addr string) []string {
func getConfigAddrs(addr string) []string {
addr = strings.Trim(addr, " ")
if addr == "" {
return nil
......@@ -549,7 +582,7 @@ func getAddrGroup(addr string) []string {
}
func (a *action) checkNodeGroupExist(title string) error {
key := calcParaNodeGroupKey(title)
key := calcParaNodeGroupAddrsKey(title)
value, err := a.db.Get(key)
if err != nil && !isNotFound(err) {
return err
......@@ -613,19 +646,9 @@ func (a *action) nodeGroupCoinsActive(createAddr string, configCoinsFrozen int64
// NodeGroupApply
func (a *action) nodeGroupApply(config *pt.ParaNodeGroupConfig) (*types.Receipt, error) {
status, err := getNodeGroupStatus(a.db, config.Title)
if err != nil && !isNotFound(err) {
return nil, err
}
if status != nil && status.Status != pt.ParacrossNodeGroupQuit {
clog.Error("node group apply exist", "status", status.Status)
return nil, pt.ErrParaNodeGroupExisted
}
addrs := getAddrGroup(config.Addrs)
addrs := getConfigAddrs(config.Addrs)
if len(addrs) == 0 {
clog.Error("node group apply addrs null", "addrs", config.Addrs)
return nil, types.ErrInvalidParam
return nil, errors.Wrapf(types.ErrInvalidParam, "node group apply addrs null:%s", config.Addrs)
}
receipt := &types.Receipt{Ty: types.ExecOk}
......@@ -640,15 +663,34 @@ func (a *action) nodeGroupApply(config *pt.ParaNodeGroupConfig) (*types.Receipt,
receipt.Logs = append(receipt.Logs, r.Logs...)
}
stat := &pt.ParaNodeGroupStatus{Status: pt.ParacrossNodeGroupApply,
stat := &pt.ParaNodeGroupStatus{
Id: calcParaNodeGroupIDKey(config.Title, common.ToHex(a.txhash)),
Status: pt.ParacrossNodeGroupApply,
Title: config.Title,
TargetAddrs: strings.Join(addrs, ","),
CoinsFrozen: config.CoinsFrozen,
MainHeight: a.exec.GetMainHeight(),
EmptyBlockInterval: config.EmptyBlockInterval,
FromAddr: a.fromaddr,
Height: a.height}
r := makeNodeGroupIDReceipt(a.fromaddr, nil, stat)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
return receipt, nil
}
func (a *action) nodeGroupModify(config *pt.ParaNodeGroupConfig) (*types.Receipt, error) {
receipt := &types.Receipt{Ty: types.ExecOk}
stat := &pt.ParaNodeGroupStatus{
Id: calcParaNodeGroupIDKey(config.Title, common.ToHex(a.txhash)),
Status: pt.ParacrossNodeGroupModify,
Title: config.Title,
ApplyAddr: strings.Join(addrs, ","),
CoinsFrozen: config.CoinsFrozen,
MainHeight: a.exec.GetMainHeight(),
EmptyBlockInterval: config.EmptyBlockInterval,
FromAddr: a.fromaddr}
saveNodeGroup(a.db, config.Title, stat)
r := makeParaNodeGroupApplyReiceipt(config.Title, a.fromaddr, status, stat, pt.TyLogParaNodeGroupApply)
Height: a.height}
r := makeNodeGroupIDReceipt(a.fromaddr, nil, stat)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
......@@ -656,29 +698,26 @@ func (a *action) nodeGroupApply(config *pt.ParaNodeGroupConfig) (*types.Receipt,
}
func (a *action) nodeGroupQuit(config *pt.ParaNodeGroupConfig) (*types.Receipt, error) {
status, err := getNodeGroupStatus(a.db, config.Title)
status, err := getNodeGroupID(a.db, config.Id)
if err != nil {
return nil, err
}
if status.Status != pt.ParacrossNodeGroupApply {
clog.Error("node group apply exist", "status", status.Status)
return nil, pt.ErrParaNodeGroupStatusWrong
}
if status.FromAddr != a.fromaddr {
clog.Error("node group create addr err", "createAddr", status.FromAddr, "currAddr", a.fromaddr)
return nil, types.ErrNotAllow
if config.Title != status.Title {
return nil, errors.Wrapf(pt.ErrNodeNotForTheTitle, "config title:%s,id title:%s", config.Title, status.Title)
}
applyAddrs, err := checkNodeGroupAddrsMatch(status.ApplyAddr, config.Addrs)
if err != nil {
return nil, err
//approved or quited
if status.Status != pt.ParacrossNodeGroupApply {
return nil, errors.Wrapf(pt.ErrParaNodeGroupStatusWrong, "node group apply not apply:%d", status.Status)
}
applyAddrs := strings.Split(status.TargetAddrs, ",")
receipt := &types.Receipt{Ty: types.ExecOk}
//main chain
if !types.IsPara() {
r, err := a.nodeGroupCoinsActive(a.fromaddr, status.CoinsFrozen, int64(len(applyAddrs)))
r, err := a.nodeGroupCoinsActive(status.FromAddr, status.CoinsFrozen, int64(len(applyAddrs)))
if err != nil {
return nil, err
}
......@@ -686,133 +725,145 @@ func (a *action) nodeGroupQuit(config *pt.ParaNodeGroupConfig) (*types.Receipt,
receipt.Logs = append(receipt.Logs, r.Logs...)
}
stat := &pt.ParaNodeGroupStatus{Status: pt.ParacrossNodeGroupQuit,
Title: config.Title,
ApplyAddr: status.ApplyAddr,
CoinsFrozen: status.CoinsFrozen,
MainHeight: a.exec.GetMainHeight(),
EmptyBlockInterval: status.EmptyBlockInterval,
FromAddr: a.fromaddr}
saveNodeGroup(a.db, config.Title, stat)
r := makeParaNodeGroupApplyReiceipt(config.Title, a.fromaddr, status, stat, pt.TyLogParaNodeGroupQuit)
copyStat := *status
status.Status = pt.ParacrossNodeGroupQuit
status.Height = a.height
r := makeNodeGroupIDReceipt(a.fromaddr, &copyStat, status)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
return receipt, nil
}
func checkNodeGroupAddrsMatch(applyAddr, confAddr string) ([]string, error) {
confAddrs := getAddrGroup(confAddr)
applyAddrs := strings.Split(applyAddr, ",")
applys := make(map[string]bool)
configs := make(map[string]bool)
diff := []string{}
for _, addr := range applyAddrs {
applys[addr] = true
}
for _, addr := range confAddrs {
configs[addr] = true
func (a *action) nodeGroupApproveModify(config *pt.ParaNodeGroupConfig, modify *pt.ParaNodeGroupStatus) (*types.Receipt, error) {
stat, err := getNodeGroupStatus(a.db, config.Title)
if err != nil {
return nil, err
}
if len(applys) != len(configs) {
clog.Error("node group addrs count not match", "apply", applyAddr, "quit", confAddr)
return nil, pt.ErrParaNodeGroupAddrNotMatch
//approve modify case
if modify.CoinsFrozen < config.CoinsFrozen {
return nil, errors.Wrapf(pt.ErrParaNodeGroupFrozenCoinsNotEnough, "id not enough coins modify:%d,config:%d", modify.CoinsFrozen, config.CoinsFrozen)
}
for _, addr := range confAddrs {
if !applys[addr] {
diff = append(diff, addr)
}
receipt := &types.Receipt{Ty: types.ExecOk}
copyModify := *modify
modify.Status = pt.ParacrossNodeGroupApprove
modify.Height = a.height
r := makeNodeGroupIDReceipt(a.fromaddr, &copyModify, modify)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
//对已经approved group和addrs不再统一修改active&frozen改动的coins,因为可能有些addr已经退出group了,没退出的,退出时候按最初设置解冻
// 这里只修改参数,对后面再加入的节点起作用
copyStat := *stat
stat.Id = modify.Id
stat.CoinsFrozen = modify.CoinsFrozen
stat.EmptyBlockInterval = modify.EmptyBlockInterval
stat.MainHeight = a.exec.GetMainHeight()
stat.Height = a.height
r = makeParaNodeGroupStatusReceipt(config.Title, a.fromaddr, &copyStat, stat)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
return receipt, nil
}
func (a *action) nodeGroupApproveApply(config *pt.ParaNodeGroupConfig, apply *pt.ParaNodeGroupStatus) (*types.Receipt, error) {
err := a.checkNodeGroupExist(config.Title)
if err != nil {
return nil, err
}
if len(diff) > 0 {
clog.Error("node group addrs not match", "apply", applyAddr, "quit", confAddr)
return nil, pt.ErrParaNodeGroupAddrNotMatch
if apply.CoinsFrozen < config.CoinsFrozen {
return nil, errors.Wrapf(pt.ErrParaNodeGroupFrozenCoinsNotEnough, "id not enough coins apply:%d,config:%d", apply.CoinsFrozen, config.CoinsFrozen)
}
return confAddrs, nil
receipt := &types.Receipt{Ty: types.ExecOk}
//create the node group
r := a.nodeGroupCreate(apply)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
copyStat := *apply
apply.Status = pt.ParacrossNodeGroupApprove
apply.MainHeight = a.exec.GetMainHeight()
apply.Height = a.height
r = makeNodeGroupIDReceipt(a.fromaddr, &copyStat, apply)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
r = makeParaNodeGroupStatusReceipt(config.Title, a.fromaddr, nil, apply)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
return receipt, nil
}
// NodeGroupApprove super addr approve the node group apply
func (a *action) nodeGroupApprove(config *pt.ParaNodeGroupConfig) (*types.Receipt, error) {
if !isSuperManager(a.fromaddr) {
clog.Error("node group approve not super manager", "addr", a.fromaddr)
return nil, types.ErrNotAllow
return nil, errors.Wrapf(types.ErrNotAllow, "node group approve not super manager:%s", a.fromaddr)
}
status, err := getNodeGroupStatus(a.db, config.Title)
id, err := getNodeGroupID(a.db, config.Id)
if err != nil {
return nil, err
}
if status.Status != pt.ParacrossNodeGroupApply {
clog.Error("node group approve not apply status", "status", status.Status)
return nil, pt.ErrParaNodeGroupStatusWrong
}
if status.CoinsFrozen < config.CoinsFrozen {
clog.Error("node group approve not apply status", "status", status.Status)
return nil, pt.ErrParaNodeGroupFrozenCoinsNotEnough
if config.Title != id.Title {
return nil, errors.Wrapf(pt.ErrNodeNotForTheTitle, "config title:%s,id title:%s", config.Title, id.Title)
}
applyAddrs, err := checkNodeGroupAddrsMatch(status.ApplyAddr, config.Addrs)
if err != nil {
return nil, err
if id.Status == pt.ParacrossNodeGroupModify {
return a.nodeGroupApproveModify(config, id)
}
receipt := &types.Receipt{Ty: types.ExecOk}
//create the node group
r, err := a.nodeGroupCreate(config.Title, applyAddrs, status.CoinsFrozen, status.FromAddr)
if err != nil {
return nil, err
if id.Status == pt.ParacrossNodeGroupApply {
return a.nodeGroupApproveApply(config, id)
}
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
stat := &pt.ParaNodeGroupStatus{Status: pt.ParacrossNodeGroupApprove,
Title: config.Title,
ApplyAddr: status.ApplyAddr,
CoinsFrozen: status.CoinsFrozen,
MainHeight: a.exec.GetMainHeight(),
EmptyBlockInterval: status.EmptyBlockInterval,
FromAddr: status.FromAddr}
saveNodeGroup(a.db, config.Title, stat)
r = makeParaNodeGroupApplyReiceipt(config.Title, a.fromaddr, status, stat, pt.TyLogParaNodeGroupApprove)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
return nil, errors.Wrapf(pt.ErrParaNodeGroupStatusWrong, "nodeGroupApprove id wrong status:%d,id:%s", id.Status, config.Id)
return receipt, nil
}
func (a *action) nodeGroupCreate(title string, nodes []string, coinFrozen int64, createAddr string) (*types.Receipt, error) {
func (a *action) nodeGroupCreate(status *pt.ParaNodeGroupStatus) *types.Receipt {
nodes := strings.Split(status.TargetAddrs, ",")
var item types.ConfigItem
key := calcParaNodeGroupKey(title)
key := calcParaNodeGroupAddrsKey(status.Title)
item.Key = string(key)
emptyValue := &types.ArrayConfig{Value: make([]string, 0)}
arr := types.ConfigItem_Arr{Arr: emptyValue}
item.Value = &arr
item.GetArr().Value = append(item.GetArr().Value, nodes...)
item.Addr = a.fromaddr
a.db.Set(key, types.Encode(&item))
receipt := makeParaNodeGroupReiceipt(title, nil, &item)
receipt := makeParaNodeGroupReceipt(status.Title, nil, &item)
//update addr status
for _, addr := range nodes {
stat := &pt.ParaNodeAddrStatus{Status: pt.ParacrossNodeAdded,
Title: title,
ApplyAddr: addr,
Votes: &pt.ParaNodeVoteDetail{},
CoinsFrozen: coinFrozen,
FromAddr: createAddr}
saveNodeAddr(a.db, title, addr, stat)
config := &pt.ParaNodeAddrConfig{
Title: title,
Addr: addr,
CoinsFrozen: coinFrozen,
}
r := makeNodeConfigReceipt(a.fromaddr, config, nil, stat)
for i, addr := range nodes {
stat := &pt.ParaNodeIdStatus{
Id: status.Id + "-" + strconv.Itoa(i),
Status: pt.ParacrossNodeJoined,
Title: status.Title,
TargetAddr: addr,
Votes: &pt.ParaNodeVoteDetail{Addrs: []string{a.fromaddr}, Votes: []string{"yes"}},
CoinsFrozen: status.CoinsFrozen,
FromAddr: status.FromAddr,
Height: a.height}
r := makeNodeConfigReceipt(a.fromaddr, nil, nil, stat)
receipt.KV = append(receipt.KV, r.KV...)
receipt.Logs = append(receipt.Logs, r.Logs...)
}
return receipt, nil
return receipt
}
//NodeGroupConfig support super node group config
......@@ -821,12 +872,11 @@ func (a *action) NodeGroupConfig(config *pt.ParaNodeGroupConfig) (*types.Receipt
return nil, pt.ErrInvalidTitle
}
s := strings.Trim(config.Addrs, " ")
if len(s) == 0 {
return nil, types.ErrInvalidParam
}
if config.Op == pt.ParacrossNodeGroupApply {
s := strings.Trim(config.Addrs, " ")
if len(s) == 0 {
return nil, types.ErrInvalidParam
}
err := a.checkNodeGroupExist(config.Title)
if err != nil {
return nil, err
......@@ -834,14 +884,19 @@ func (a *action) NodeGroupConfig(config *pt.ParaNodeGroupConfig) (*types.Receipt
return a.nodeGroupApply(config)
} else if config.Op == pt.ParacrossNodeGroupApprove {
err := a.checkNodeGroupExist(config.Title)
if err != nil {
return nil, err
if config.Id == "" {
return nil, types.ErrInvalidParam
}
return a.nodeGroupApprove(config)
} else if config.Op == pt.ParacrossNodeGroupQuit {
if config.Id == "" {
return nil, types.ErrInvalidParam
}
return a.nodeGroupQuit(config)
} else if config.Op == pt.ParacrossNodeGroupModify {
return a.nodeGroupModify(config)
}
return nil, pt.ErrParaUnSupportNodeOper
......@@ -858,9 +913,15 @@ func (a *action) NodeConfig(config *pt.ParaNodeAddrConfig) (*types.Receipt, erro
return a.nodeJoin(config)
} else if config.Op == pt.ParaNodeQuit {
if config.Id == "" {
return nil, types.ErrInvalidParam
}
return a.nodeQuit(config)
} else if config.Op == pt.ParaNodeVote {
if config.Id == "" || config.Value >= pt.ParaNodeVoteEnd {
return nil, types.ErrInvalidParam
}
return a.nodeVote(config)
}
......
......@@ -74,7 +74,7 @@ func (suite *NodeManageTestSuite) SetupSuite() {
}
func (suite *NodeManageTestSuite) TestSetup() {
nodeConfigKey := calcParaNodeGroupKey(Title)
nodeConfigKey := calcParaNodeGroupAddrsKey(Title)
suite.T().Log(string(nodeConfigKey))
_, err := suite.stateDB.Get(nodeConfigKey)
if err != nil {
......@@ -96,6 +96,11 @@ func nodeCommitImpl(suite suite.Suite, exec *Paracross, privkeyStr string, tx *t
assert.NotNil(suite.T(), receipt)
assert.Nil(suite.T(), err)
for _, v := range receipt.KV {
if err := exec.GetStateDB().Set(v.Key, v.Value); err != nil {
panic(err)
}
}
return
}
......@@ -104,52 +109,52 @@ func checkGroupApplyReceipt(suite *NodeManageTestSuite, receipt *types.Receipt)
assert.Len(suite.T(), receipt.KV, 1)
assert.Len(suite.T(), receipt.Logs, 1)
var stat pt.ParaNodeAddrStatus
var stat pt.ParaNodeIdStatus
err := types.Decode(receipt.KV[0].Value, &stat)
assert.Nil(suite.T(), err, "decode ParaNodeAddrStatus failed")
//suite.T().Log("titleHeight", titleHeight)
assert.Equal(suite.T(), int32(pt.TyLogParaNodeGroupApply), receipt.Logs[0].Ty)
assert.Equal(suite.T(), int32(pt.TyLogParaNodeGroupConfig), receipt.Logs[0].Ty)
assert.Equal(suite.T(), int32(pt.ParacrossNodeGroupApply), stat.Status)
}
func checkGroupApproveReceipt(suite *NodeManageTestSuite, receipt *types.Receipt) {
assert.Equal(suite.T(), receipt.Ty, int32(types.ExecOk))
assert.Len(suite.T(), receipt.KV, 6)
assert.Len(suite.T(), receipt.Logs, 6)
assert.Len(suite.T(), receipt.KV, 11)
assert.Len(suite.T(), receipt.Logs, 7)
len := len(receipt.KV)
var stat pt.ParaNodeAddrStatus
var stat pt.ParaNodeIdStatus
err := types.Decode(receipt.KV[len-1].Value, &stat)
assert.Nil(suite.T(), err, "decode ParaNodeAddrStatus failed")
//suite.T().Log("titleHeight", titleHeight)
assert.Equal(suite.T(), int32(pt.TyLogParaNodeGroupApprove), receipt.Logs[len-1].Ty)
//suite.T().Log("ty len-1", receipt.Logs[lenLogs-1].Ty,"len",lenLogs)
assert.Equal(suite.T(), int32(pt.TyLogParaNodeGroupStatusUpdate), receipt.Logs[7-1].Ty)
assert.Equal(suite.T(), int32(pt.ParacrossNodeGroupApprove), stat.Status)
}
func checkJoinReceipt(suite *NodeManageTestSuite, receipt *types.Receipt) {
assert.Equal(suite.T(), receipt.Ty, int32(types.ExecOk))
assert.Len(suite.T(), receipt.KV, 1)
assert.Len(suite.T(), receipt.KV, 2)
assert.Len(suite.T(), receipt.Logs, 1)
var stat pt.ParaNodeAddrStatus
var stat pt.ParaNodeIdStatus
err := types.Decode(receipt.KV[0].Value, &stat)
assert.Nil(suite.T(), err, "decode ParaNodeAddrStatus failed")
//suite.T().Log("titleHeight", titleHeight)
assert.Equal(suite.T(), int32(pt.TyLogParaNodeConfig), receipt.Logs[0].Ty)
assert.Equal(suite.T(), int32(pt.ParacrossNodeAdding), stat.Status)
assert.Equal(suite.T(), int32(pt.ParacrossNodeJoining), stat.Status)
assert.NotNil(suite.T(), stat.Votes)
}
func checkQuitReceipt(suite *NodeManageTestSuite, receipt *types.Receipt) {
assert.Equal(suite.T(), receipt.Ty, int32(types.ExecOk))
assert.Len(suite.T(), receipt.KV, 1)
assert.Len(suite.T(), receipt.KV, 2)
assert.Len(suite.T(), receipt.Logs, 1)
var stat pt.ParaNodeAddrStatus
var stat pt.ParaNodeIdStatus
err := types.Decode(receipt.KV[0].Value, &stat)
assert.Nil(suite.T(), err, "decode ParaNodeAddrStatus failed")
//suite.T().Log("titleHeight", titleHeight)
......@@ -161,10 +166,8 @@ func checkQuitReceipt(suite *NodeManageTestSuite, receipt *types.Receipt) {
func checkVoteReceipt(suite *NodeManageTestSuite, receipt *types.Receipt, count int) {
assert.Equal(suite.T(), receipt.Ty, int32(types.ExecOk))
assert.Len(suite.T(), receipt.KV, 1)
assert.Len(suite.T(), receipt.Logs, 1)
var stat pt.ParaNodeAddrStatus
var stat pt.ParaNodeIdStatus
err := types.Decode(receipt.KV[0].Value, &stat)
assert.Nil(suite.T(), err, "decode ParaNodeAddrStatus failed")
assert.Len(suite.T(), stat.Votes.Votes, count)
......@@ -172,43 +175,47 @@ func checkVoteReceipt(suite *NodeManageTestSuite, receipt *types.Receipt, count
}
func checkVoteDoneReceipt(suite *NodeManageTestSuite, receipt *types.Receipt, count int, join bool) {
suite.NotNil(receipt)
assert.Equal(suite.T(), receipt.Ty, int32(types.ExecOk))
assert.Len(suite.T(), receipt.KV, 2)
assert.Len(suite.T(), receipt.Logs, 3)
var stat pt.ParaNodeAddrStatus
err := types.Decode(receipt.KV[0].Value, &stat)
assert.Nil(suite.T(), err, "decode ParaNodeAddrStatus failed")
assert.Len(suite.T(), stat.Votes.Votes, count)
suite.T().Log("checkVoteDoneReceipt", "kvlen", len(receipt.KV))
var item types.ConfigItem
err = types.Decode(receipt.KV[1].Value, &item)
assert.Nil(suite.T(), err, "decode ParaNodeAddrStatus failed")
_, arry, err := getParacrossNodes(suite.stateDB, Title)
suite.Suite.Nil(err)
if join {
suite.Contains(item.GetArr().Value, Account14K)
suite.Contains(arry, Account14K)
} else {
suite.NotContains(item.GetArr().Value, Account14K)
suite.NotContains(arry, Account14K)
}
}
func voteTest(suite *NodeManageTestSuite, addr string, join bool) {
func voteTest(suite *NodeManageTestSuite, id string, join bool) {
var count int
config := &pt.ParaNodeAddrConfig{
Op: pt.ParaNodeVote,
Addr: addr,
Id: id,
Value: pt.ParaNodeVoteYes,
}
tx, err := pt.CreateRawNodeConfigTx(config)
suite.Nil(err)
count++
receipt := nodeCommit(suite, PrivKeyA, tx)
checkVoteReceipt(suite, receipt, 1)
checkVoteReceipt(suite, receipt, count)
count++
receipt = nodeCommit(suite, PrivKeyB, tx)
checkVoteReceipt(suite, receipt, 2)
checkVoteReceipt(suite, receipt, count)
count++
if !join {
receipt = nodeCommit(suite, PrivKey14K, tx)
checkVoteReceipt(suite, receipt, count)
count++
}
receipt = nodeCommit(suite, PrivKeyC, tx)
checkVoteDoneReceipt(suite, receipt, 3, join)
checkVoteDoneReceipt(suite, receipt, count, join)
}
func (suite *NodeManageTestSuite) testNodeGroupConfigQuit() {
......@@ -222,9 +229,14 @@ func (suite *NodeManageTestSuite) testNodeGroupConfigQuit() {
receipt := nodeCommit(suite, PrivKeyB, tx)
checkGroupApplyReceipt(suite, receipt)
suite.Equal(int32(pt.TyLogParaNodeGroupConfig), receipt.Logs[0].Ty)
var g pt.ReceiptParaNodeGroupConfig
err = types.Decode(receipt.Logs[0].Log, &g)
suite.Nil(err)
config = &pt.ParaNodeGroupConfig{
Addrs: applyAddrs,
Op: pt.ParacrossNodeGroupQuit,
Id: g.Current.Id,
Op: pt.ParacrossNodeGroupQuit,
}
tx, err = pt.CreateRawNodeGroupApplyTx(config)
suite.Nil(err)
......@@ -247,9 +259,14 @@ func (suite *NodeManageTestSuite) testNodeGroupConfig() {
receipt := nodeCommit(suite, PrivKeyB, tx)
checkGroupApplyReceipt(suite, receipt)
suite.Equal(int32(pt.TyLogParaNodeGroupConfig), receipt.Logs[0].Ty)
var g pt.ReceiptParaNodeGroupConfig
err = types.Decode(receipt.Logs[0].Log, &g)
suite.Nil(err)
config = &pt.ParaNodeGroupConfig{
Addrs: applyAddrs,
Op: pt.ParacrossNodeGroupApprove,
Id: g.Current.Id,
Op: pt.ParacrossNodeGroupApprove,
}
tx, err = pt.CreateRawNodeGroupApplyTx(config)
suite.Nil(err)
......@@ -271,13 +288,18 @@ func (suite *NodeManageTestSuite) testNodeConfig() {
receipt := nodeCommit(suite, PrivKey14K, tx)
checkJoinReceipt(suite, receipt)
suite.Equal(int32(pt.TyLogParaNodeConfig), receipt.Logs[0].Ty)
var g pt.ReceiptParaNodeConfig
err = types.Decode(receipt.Logs[0].Log, &g)
suite.Nil(err)
//vote test
voteTest(suite, Account14K, true)
voteTest(suite, g.Current.Id, true)
//Quit test
config = &pt.ParaNodeAddrConfig{
Op: pt.ParaNodeQuit,
Addr: Account1MC,
Op: pt.ParaNodeQuit,
Id: g.Current.Id,
}
tx, err = pt.CreateRawNodeConfigTx(config)
suite.Nil(err)
......@@ -285,7 +307,7 @@ func (suite *NodeManageTestSuite) testNodeConfig() {
checkQuitReceipt(suite, receipt)
//vote test
voteTest(suite, Account1MC, false)
voteTest(suite, g.Current.Id, false)
}
func (suite *NodeManageTestSuite) TestExec() {
......@@ -310,22 +332,22 @@ func (suite *NodeManageTestSuite) TearDownSuite() {
func TestGetAddrGroup(t *testing.T) {
addrs := " 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4, 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR, 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k, ,,, 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs , "
retAddrs := getAddrGroup(addrs)
retAddrs := getConfigAddrs(addrs)
expectAddrs := []string{"1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4", "1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR", "1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k", "1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"}
assert.Equal(t, expectAddrs, retAddrs)
addrs = " 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 , , "
retAddrs = getAddrGroup(addrs)
retAddrs = getConfigAddrs(addrs)
expectAddrs = []string{"1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4"}
assert.Equal(t, expectAddrs, retAddrs)
addrs = " , "
ret := getAddrGroup(addrs)
ret := getConfigAddrs(addrs)
assert.Equal(t, []string(nil), ret)
assert.Equal(t, 0, len(ret))
addrs = " "
ret = getAddrGroup(addrs)
ret = getConfigAddrs(addrs)
assert.Equal(t, []string(nil), ret)
assert.Equal(t, 0, len(ret))
......
......@@ -47,71 +47,77 @@ message ParacrossConsensusStatus {
string consensBlockHash = 4;
}
message ParaNodeAddrConfig{
message ParaNodeAddrConfig {
string title = 1;
string op = 2;
string addr = 3;
string value = 4;
int64 coinsFrozen = 5;
uint32 op = 2;
string id = 3;
string addr = 4;
uint32 value = 5;
int64 coinsFrozen = 6;
}
message ParaNodeVoteDetail{
message ParaNodeVoteDetail {
repeated string addrs = 1;
repeated string votes = 2;
}
message ParaNodeAddrStatus{
int32 status = 1;
string title = 2;
string applyAddr = 3;
int64 coinsFrozen = 4;
ParaNodeVoteDetail votes = 5;
string fromAddr = 6;
message ParaNodeAddrIdStatus {
string proposalId = 1;
}
message ParaNodeIdStatus {
string id = 1;
int32 status = 2;
string title = 3;
string targetAddr = 4;
int64 coinsFrozen = 5;
ParaNodeVoteDetail votes = 6;
string fromAddr = 7;
int64 height = 8;
}
message ReceiptParaNodeConfig {
string addr = 1;
ParaNodeAddrConfig config = 2;
ParaNodeAddrStatus prev = 3;
ParaNodeAddrStatus current = 4;
ParaNodeIdStatus prev = 3;
ParaNodeIdStatus current = 4;
}
message ReceiptParaNodeVoteRecord {
string fromAddr = 1;
string voteAddr = 2;
int32 value = 3;
}
message ReceiptParaNodeVoteDone {
string title = 1;
string targetAddr = 2;
int32 totalNodes = 3;
int32 totalVote = 4;
int32 mostVote = 5;
string voteRst = 6;
int32 doneStatus = 7;
string id = 1;
string title = 2;
string targetAddr = 3;
int32 totalNodes = 4;
int32 totalVote = 5;
int32 mostVote = 6;
string voteRst = 7;
int32 doneStatus = 8;
}
message ParaNodeGroupConfig {
string title = 1;
uint32 op = 2;
string addrs = 3;
int64 coinsFrozen = 4;
uint32 emptyBlockInterval = 5;
string id = 3;
string addrs = 4;
int64 coinsFrozen = 5;
uint32 emptyBlockInterval = 6;
}
message ParaNodeGroupStatus {
int32 status = 1;
string title = 2;
string applyAddr = 3;
int64 coinsFrozen = 4;
uint32 emptyBlockInterval = 5;
int64 mainHeight = 6;
string fromAddr = 7;
string id = 1;
int32 status = 2;
string title = 3;
string targetAddrs = 4;
int64 coinsFrozen = 5;
uint32 emptyBlockInterval = 6;
int64 mainHeight = 7;
string fromAddr = 8;
int64 height = 9;
}
message ReceiptParaNodeGroupConfig {
......@@ -125,16 +131,18 @@ message ReceiptParaNodeGroupConfig {
// node query
message ReqParacrossNodeInfo {
string title = 1;
string addr = 2;
int32 status = 3;
string id = 2;
string addr = 3;
int32 status = 4;
}
message RespParacrossNodeAddrs {
repeated ParaNodeAddrStatus addrs = 1;
repeated ParaNodeIdStatus ids = 1;
}
message RespParacrossNodeGroups {
repeated ParaNodeGroupStatus addrs = 1;
repeated ParaNodeGroupStatus ids = 1;
}
message ParaBlock2MainMap {
......
......@@ -180,13 +180,26 @@ func (c *Jrpc) GetBlock2MainInfo(req *types.ReqBlocks, result *interface{}) erro
}
// GetNodeStatus get super node status
func (c *channelClient) GetNodeStatus(ctx context.Context, req *pt.ReqParacrossNodeInfo) (*pt.ParaNodeAddrStatus, error) {
func (c *channelClient) GetNodeStatus(ctx context.Context, req *pt.ReqParacrossNodeInfo) (*pt.ParaNodeIdStatus, error) {
r := *req
data, err := c.Query(pt.GetExecName(), "GetNodeAddrInfo", &r)
if err != nil {
return nil, err
}
if resp, ok := data.(*pt.ParaNodeAddrStatus); ok {
if resp, ok := data.(*pt.ParaNodeIdStatus); ok {
return resp, nil
}
return nil, types.ErrDecode
}
// GetNodeStatus get super node status
func (c *channelClient) GetNodeIDStatus(ctx context.Context, req *pt.ReqParacrossNodeInfo) (*pt.ParaNodeIdStatus, error) {
r := *req
data, err := c.Query(pt.GetExecName(), "GetNodeIdInfo", &r)
if err != nil {
return nil, err
}
if resp, ok := data.(*pt.ParaNodeIdStatus); ok {
return resp, nil
}
return nil, types.ErrDecode
......@@ -194,7 +207,20 @@ func (c *channelClient) GetNodeStatus(ctx context.Context, req *pt.ReqParacrossN
// GetNodeStatus get super node status
func (c *Jrpc) GetNodeStatus(req *pt.ReqParacrossNodeInfo, result *interface{}) error {
data, err := c.cli.GetNodeStatus(context.Background(), req)
if req == nil || (req.Addr == "" && req.Id == "") {
return types.ErrInvalidParam
}
var data *pt.ParaNodeIdStatus
var err error
if req.Addr != "" {
data, err = c.cli.GetNodeStatus(context.Background(), req)
}
if req.Id != "" {
data, err = c.cli.GetNodeIDStatus(context.Background(), req)
}
*result = data
return err
}
......
......@@ -47,8 +47,6 @@ var (
ErrParaNodeGroupFrozenCoinsNotEnough = errors.New("ErrParaNodeGroupFrozenCoinsNotEnough")
//ErrParaNodeGroupStatusWrong node group process wrong status
ErrParaNodeGroupStatusWrong = errors.New("ErrParaNodeGroupStatusWrong")
//ErrParaNodeGroupAddrNotMatch group addrs not match with apply
ErrParaNodeGroupAddrNotMatch = errors.New("ErrParaNodeGroupAddrNotMatch")
//ErrParaConsensStopBlocksNotReach consensus stop blocks not reach
ErrParaConsensStopBlocksNotReach = errors.New("ErrParaConsensStopBlocksNotReach")
)
......@@ -37,12 +37,11 @@ const (
// TyLogParaAssetDeposit asset deposit log key
TyLogParaAssetDeposit = 656
// TyLogParaNodeConfig config super node log key
TyLogParaNodeConfig = 657
TyLogParaNodeVoteDone = 658
TyLogParaNodeGroupUpdate = 659
TyLogParaNodeGroupApply = 660
TyLogParaNodeGroupApprove = 661
TyLogParaNodeGroupQuit = 662
TyLogParaNodeConfig = 657
TyLogParaNodeVoteDone = 658
TyLogParaNodeGroupAddrsUpdate = 659
TyLogParaNodeGroupConfig = 660
TyLogParaNodeGroupStatusUpdate = 664
)
type paracrossCommitTx struct {
......@@ -90,19 +89,27 @@ const (
// node config op
const (
ParaNodeJoin = "join"
ParaNodeQuit = "quit"
ParaNodeVote = "vote"
ParaNodeJoin = iota + 1
ParaNodeVote
ParaNodeQuit
)
ParaNodeVoteYes = "yes"
ParaNodeVoteNo = "no"
// node vote op
const (
ParaNodeVoteInvalid = iota
ParaNodeVoteYes
ParaNodeVoteNo
ParaNodeVoteEnd
)
// ParaNodeVoteStr ...
var ParaNodeVoteStr = []string{"invalid", "yes", "no"}
const (
// ParacrossNodeAdding apply for adding group
ParacrossNodeAdding = iota + 1
// ParacrossNodeAdded pass to add by votes
ParacrossNodeAdded
// ParacrossNodeJoining apply for adding group
ParacrossNodeJoining = iota + 1
// ParacrossNodeJoined pass to add by votes
ParacrossNodeJoined
// ParacrossNodeQuiting apply for quiting
ParacrossNodeQuiting
// ParacrossNodeQuited pass to quite by votes
......@@ -116,6 +123,8 @@ const (
ParacrossNodeGroupApprove
//ParacrossNodeGroupQuit applyer quit the apply when not be approved
ParacrossNodeGroupQuit
//ParacrossNodeGroupModify applyer modify some parameters
ParacrossNodeGroupModify
)
var (
......@@ -179,6 +188,7 @@ func createRawCommitTx(status *ParacrossNodeStatus, name string, fee int64) (*ty
func CreateRawNodeConfigTx(config *ParaNodeAddrConfig) (*types.Transaction, error) {
config.Title = types.GetTitle()
config.Addr = strings.Trim(config.Addr, " ")
config.Id = strings.Trim(config.Id, " ")
action := &ParacrossAction{
Ty: ParacrossActionNodeConfig,
......@@ -195,6 +205,7 @@ func CreateRawNodeConfigTx(config *ParaNodeAddrConfig) (*types.Transaction, erro
func CreateRawNodeGroupApplyTx(apply *ParaNodeGroupConfig) (*types.Transaction, error) {
apply.Title = types.GetTitle()
apply.EmptyBlockInterval = 4
apply.Id = strings.Trim(apply.Id, " ")
interval := types.Conf("config.consensus.sub.para").GInt("emptyBlockInterval")
if interval > 0 {
apply.EmptyBlockInterval = uint32(interval)
......
......@@ -359,10 +359,11 @@ func (m *ParacrossConsensusStatus) GetConsensBlockHash() string {
type ParaNodeAddrConfig struct {
Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
Op string `protobuf:"bytes,2,opt,name=op,proto3" json:"op,omitempty"`
Addr string `protobuf:"bytes,3,opt,name=addr,proto3" json:"addr,omitempty"`
Value string `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
CoinsFrozen int64 `protobuf:"varint,5,opt,name=coinsFrozen,proto3" json:"coinsFrozen,omitempty"`
Op uint32 `protobuf:"varint,2,opt,name=op,proto3" json:"op,omitempty"`
Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
Addr string `protobuf:"bytes,4,opt,name=addr,proto3" json:"addr,omitempty"`
Value uint32 `protobuf:"varint,5,opt,name=value,proto3" json:"value,omitempty"`
CoinsFrozen int64 `protobuf:"varint,6,opt,name=coinsFrozen,proto3" json:"coinsFrozen,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -400,10 +401,17 @@ func (m *ParaNodeAddrConfig) GetTitle() string {
return ""
}
func (m *ParaNodeAddrConfig) GetOp() string {
func (m *ParaNodeAddrConfig) GetOp() uint32 {
if m != nil {
return m.Op
}
return 0
}
func (m *ParaNodeAddrConfig) GetId() string {
if m != nil {
return m.Id
}
return ""
}
......@@ -414,11 +422,11 @@ func (m *ParaNodeAddrConfig) GetAddr() string {
return ""
}
func (m *ParaNodeAddrConfig) GetValue() string {
func (m *ParaNodeAddrConfig) GetValue() uint32 {
if m != nil {
return m.Value
}
return ""
return 0
}
func (m *ParaNodeAddrConfig) GetCoinsFrozen() int64 {
......@@ -475,90 +483,145 @@ func (m *ParaNodeVoteDetail) GetVotes() []string {
return nil
}
type ParaNodeAddrStatus struct {
Status int32 `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
ApplyAddr string `protobuf:"bytes,3,opt,name=applyAddr,proto3" json:"applyAddr,omitempty"`
CoinsFrozen int64 `protobuf:"varint,4,opt,name=coinsFrozen,proto3" json:"coinsFrozen,omitempty"`
Votes *ParaNodeVoteDetail `protobuf:"bytes,5,opt,name=votes,proto3" json:"votes,omitempty"`
FromAddr string `protobuf:"bytes,6,opt,name=fromAddr,proto3" json:"fromAddr,omitempty"`
type ParaNodeAddrIdStatus struct {
ProposalId string `protobuf:"bytes,1,opt,name=proposalId,proto3" json:"proposalId,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ParaNodeAddrIdStatus) Reset() { *m = ParaNodeAddrIdStatus{} }
func (m *ParaNodeAddrIdStatus) String() string { return proto.CompactTextString(m) }
func (*ParaNodeAddrIdStatus) ProtoMessage() {}
func (*ParaNodeAddrIdStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_6a397e38c9ea6747, []int{7}
}
func (m *ParaNodeAddrIdStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ParaNodeAddrIdStatus.Unmarshal(m, b)
}
func (m *ParaNodeAddrIdStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ParaNodeAddrIdStatus.Marshal(b, m, deterministic)
}
func (m *ParaNodeAddrIdStatus) XXX_Merge(src proto.Message) {
xxx_messageInfo_ParaNodeAddrIdStatus.Merge(m, src)
}
func (m *ParaNodeAddrIdStatus) XXX_Size() int {
return xxx_messageInfo_ParaNodeAddrIdStatus.Size(m)
}
func (m *ParaNodeAddrIdStatus) XXX_DiscardUnknown() {
xxx_messageInfo_ParaNodeAddrIdStatus.DiscardUnknown(m)
}
var xxx_messageInfo_ParaNodeAddrIdStatus proto.InternalMessageInfo
func (m *ParaNodeAddrIdStatus) GetProposalId() string {
if m != nil {
return m.ProposalId
}
return ""
}
type ParaNodeIdStatus struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"`
TargetAddr string `protobuf:"bytes,4,opt,name=targetAddr,proto3" json:"targetAddr,omitempty"`
CoinsFrozen int64 `protobuf:"varint,5,opt,name=coinsFrozen,proto3" json:"coinsFrozen,omitempty"`
Votes *ParaNodeVoteDetail `protobuf:"bytes,6,opt,name=votes,proto3" json:"votes,omitempty"`
FromAddr string `protobuf:"bytes,7,opt,name=fromAddr,proto3" json:"fromAddr,omitempty"`
Height int64 `protobuf:"varint,8,opt,name=height,proto3" json:"height,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ParaNodeAddrStatus) Reset() { *m = ParaNodeAddrStatus{} }
func (m *ParaNodeAddrStatus) String() string { return proto.CompactTextString(m) }
func (*ParaNodeAddrStatus) ProtoMessage() {}
func (*ParaNodeAddrStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_6a397e38c9ea6747, []int{7}
func (m *ParaNodeIdStatus) Reset() { *m = ParaNodeIdStatus{} }
func (m *ParaNodeIdStatus) String() string { return proto.CompactTextString(m) }
func (*ParaNodeIdStatus) ProtoMessage() {}
func (*ParaNodeIdStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_6a397e38c9ea6747, []int{8}
}
func (m *ParaNodeAddrStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ParaNodeAddrStatus.Unmarshal(m, b)
func (m *ParaNodeIdStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ParaNodeIdStatus.Unmarshal(m, b)
}
func (m *ParaNodeAddrStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ParaNodeAddrStatus.Marshal(b, m, deterministic)
func (m *ParaNodeIdStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ParaNodeIdStatus.Marshal(b, m, deterministic)
}
func (m *ParaNodeAddrStatus) XXX_Merge(src proto.Message) {
xxx_messageInfo_ParaNodeAddrStatus.Merge(m, src)
func (m *ParaNodeIdStatus) XXX_Merge(src proto.Message) {
xxx_messageInfo_ParaNodeIdStatus.Merge(m, src)
}
func (m *ParaNodeAddrStatus) XXX_Size() int {
return xxx_messageInfo_ParaNodeAddrStatus.Size(m)
func (m *ParaNodeIdStatus) XXX_Size() int {
return xxx_messageInfo_ParaNodeIdStatus.Size(m)
}
func (m *ParaNodeAddrStatus) XXX_DiscardUnknown() {
xxx_messageInfo_ParaNodeAddrStatus.DiscardUnknown(m)
func (m *ParaNodeIdStatus) XXX_DiscardUnknown() {
xxx_messageInfo_ParaNodeIdStatus.DiscardUnknown(m)
}
var xxx_messageInfo_ParaNodeAddrStatus proto.InternalMessageInfo
var xxx_messageInfo_ParaNodeIdStatus proto.InternalMessageInfo
func (m *ParaNodeIdStatus) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *ParaNodeAddrStatus) GetStatus() int32 {
func (m *ParaNodeIdStatus) GetStatus() int32 {
if m != nil {
return m.Status
}
return 0
}
func (m *ParaNodeAddrStatus) GetTitle() string {
func (m *ParaNodeIdStatus) GetTitle() string {
if m != nil {
return m.Title
}
return ""
}
func (m *ParaNodeAddrStatus) GetApplyAddr() string {
func (m *ParaNodeIdStatus) GetTargetAddr() string {
if m != nil {
return m.ApplyAddr
return m.TargetAddr
}
return ""
}
func (m *ParaNodeAddrStatus) GetCoinsFrozen() int64 {
func (m *ParaNodeIdStatus) GetCoinsFrozen() int64 {
if m != nil {
return m.CoinsFrozen
}
return 0
}
func (m *ParaNodeAddrStatus) GetVotes() *ParaNodeVoteDetail {
func (m *ParaNodeIdStatus) GetVotes() *ParaNodeVoteDetail {
if m != nil {
return m.Votes
}
return nil
}
func (m *ParaNodeAddrStatus) GetFromAddr() string {
func (m *ParaNodeIdStatus) GetFromAddr() string {
if m != nil {
return m.FromAddr
}
return ""
}
func (m *ParaNodeIdStatus) GetHeight() int64 {
if m != nil {
return m.Height
}
return 0
}
type ReceiptParaNodeConfig struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
Config *ParaNodeAddrConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
Prev *ParaNodeAddrStatus `protobuf:"bytes,3,opt,name=prev,proto3" json:"prev,omitempty"`
Current *ParaNodeAddrStatus `protobuf:"bytes,4,opt,name=current,proto3" json:"current,omitempty"`
Prev *ParaNodeIdStatus `protobuf:"bytes,3,opt,name=prev,proto3" json:"prev,omitempty"`
Current *ParaNodeIdStatus `protobuf:"bytes,4,opt,name=current,proto3" json:"current,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -568,7 +631,7 @@ func (m *ReceiptParaNodeConfig) Reset() { *m = ReceiptParaNodeConfig{} }
func (m *ReceiptParaNodeConfig) String() string { return proto.CompactTextString(m) }
func (*ReceiptParaNodeConfig) ProtoMessage() {}
func (*ReceiptParaNodeConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_6a397e38c9ea6747, []int{8}
return fileDescriptor_6a397e38c9ea6747, []int{9}
}
func (m *ReceiptParaNodeConfig) XXX_Unmarshal(b []byte) error {
......@@ -603,83 +666,29 @@ func (m *ReceiptParaNodeConfig) GetConfig() *ParaNodeAddrConfig {
return nil
}
func (m *ReceiptParaNodeConfig) GetPrev() *ParaNodeAddrStatus {
func (m *ReceiptParaNodeConfig) GetPrev() *ParaNodeIdStatus {
if m != nil {
return m.Prev
}
return nil
}
func (m *ReceiptParaNodeConfig) GetCurrent() *ParaNodeAddrStatus {
func (m *ReceiptParaNodeConfig) GetCurrent() *ParaNodeIdStatus {
if m != nil {
return m.Current
}
return nil
}
type ReceiptParaNodeVoteRecord struct {
FromAddr string `protobuf:"bytes,1,opt,name=fromAddr,proto3" json:"fromAddr,omitempty"`
VoteAddr string `protobuf:"bytes,2,opt,name=voteAddr,proto3" json:"voteAddr,omitempty"`
Value int32 `protobuf:"varint,3,opt,name=value,proto3" json:"value,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReceiptParaNodeVoteRecord) Reset() { *m = ReceiptParaNodeVoteRecord{} }
func (m *ReceiptParaNodeVoteRecord) String() string { return proto.CompactTextString(m) }
func (*ReceiptParaNodeVoteRecord) ProtoMessage() {}
func (*ReceiptParaNodeVoteRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_6a397e38c9ea6747, []int{9}
}
func (m *ReceiptParaNodeVoteRecord) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReceiptParaNodeVoteRecord.Unmarshal(m, b)
}
func (m *ReceiptParaNodeVoteRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReceiptParaNodeVoteRecord.Marshal(b, m, deterministic)
}
func (m *ReceiptParaNodeVoteRecord) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReceiptParaNodeVoteRecord.Merge(m, src)
}
func (m *ReceiptParaNodeVoteRecord) XXX_Size() int {
return xxx_messageInfo_ReceiptParaNodeVoteRecord.Size(m)
}
func (m *ReceiptParaNodeVoteRecord) XXX_DiscardUnknown() {
xxx_messageInfo_ReceiptParaNodeVoteRecord.DiscardUnknown(m)
}
var xxx_messageInfo_ReceiptParaNodeVoteRecord proto.InternalMessageInfo
func (m *ReceiptParaNodeVoteRecord) GetFromAddr() string {
if m != nil {
return m.FromAddr
}
return ""
}
func (m *ReceiptParaNodeVoteRecord) GetVoteAddr() string {
if m != nil {
return m.VoteAddr
}
return ""
}
func (m *ReceiptParaNodeVoteRecord) GetValue() int32 {
if m != nil {
return m.Value
}
return 0
}
type ReceiptParaNodeVoteDone struct {
Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
TargetAddr string `protobuf:"bytes,2,opt,name=targetAddr,proto3" json:"targetAddr,omitempty"`
TotalNodes int32 `protobuf:"varint,3,opt,name=totalNodes,proto3" json:"totalNodes,omitempty"`
TotalVote int32 `protobuf:"varint,4,opt,name=totalVote,proto3" json:"totalVote,omitempty"`
MostVote int32 `protobuf:"varint,5,opt,name=mostVote,proto3" json:"mostVote,omitempty"`
VoteRst string `protobuf:"bytes,6,opt,name=voteRst,proto3" json:"voteRst,omitempty"`
DoneStatus int32 `protobuf:"varint,7,opt,name=doneStatus,proto3" json:"doneStatus,omitempty"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
TargetAddr string `protobuf:"bytes,3,opt,name=targetAddr,proto3" json:"targetAddr,omitempty"`
TotalNodes int32 `protobuf:"varint,4,opt,name=totalNodes,proto3" json:"totalNodes,omitempty"`
TotalVote int32 `protobuf:"varint,5,opt,name=totalVote,proto3" json:"totalVote,omitempty"`
MostVote int32 `protobuf:"varint,6,opt,name=mostVote,proto3" json:"mostVote,omitempty"`
VoteRst string `protobuf:"bytes,7,opt,name=voteRst,proto3" json:"voteRst,omitempty"`
DoneStatus int32 `protobuf:"varint,8,opt,name=doneStatus,proto3" json:"doneStatus,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -710,6 +719,13 @@ func (m *ReceiptParaNodeVoteDone) XXX_DiscardUnknown() {
var xxx_messageInfo_ReceiptParaNodeVoteDone proto.InternalMessageInfo
func (m *ReceiptParaNodeVoteDone) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *ReceiptParaNodeVoteDone) GetTitle() string {
if m != nil {
return m.Title
......@@ -762,9 +778,10 @@ func (m *ReceiptParaNodeVoteDone) GetDoneStatus() int32 {
type ParaNodeGroupConfig struct {
Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
Op uint32 `protobuf:"varint,2,opt,name=op,proto3" json:"op,omitempty"`
Addrs string `protobuf:"bytes,3,opt,name=addrs,proto3" json:"addrs,omitempty"`
CoinsFrozen int64 `protobuf:"varint,4,opt,name=coinsFrozen,proto3" json:"coinsFrozen,omitempty"`
EmptyBlockInterval uint32 `protobuf:"varint,5,opt,name=emptyBlockInterval,proto3" json:"emptyBlockInterval,omitempty"`
Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
Addrs string `protobuf:"bytes,4,opt,name=addrs,proto3" json:"addrs,omitempty"`
CoinsFrozen int64 `protobuf:"varint,5,opt,name=coinsFrozen,proto3" json:"coinsFrozen,omitempty"`
EmptyBlockInterval uint32 `protobuf:"varint,6,opt,name=emptyBlockInterval,proto3" json:"emptyBlockInterval,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -809,6 +826,13 @@ func (m *ParaNodeGroupConfig) GetOp() uint32 {
return 0
}
func (m *ParaNodeGroupConfig) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *ParaNodeGroupConfig) GetAddrs() string {
if m != nil {
return m.Addrs
......@@ -831,13 +855,15 @@ func (m *ParaNodeGroupConfig) GetEmptyBlockInterval() uint32 {
}
type ParaNodeGroupStatus struct {
Status int32 `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
ApplyAddr string `protobuf:"bytes,3,opt,name=applyAddr,proto3" json:"applyAddr,omitempty"`
CoinsFrozen int64 `protobuf:"varint,4,opt,name=coinsFrozen,proto3" json:"coinsFrozen,omitempty"`
EmptyBlockInterval uint32 `protobuf:"varint,5,opt,name=emptyBlockInterval,proto3" json:"emptyBlockInterval,omitempty"`
MainHeight int64 `protobuf:"varint,6,opt,name=mainHeight,proto3" json:"mainHeight,omitempty"`
FromAddr string `protobuf:"bytes,7,opt,name=fromAddr,proto3" json:"fromAddr,omitempty"`
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"`
TargetAddrs string `protobuf:"bytes,4,opt,name=targetAddrs,proto3" json:"targetAddrs,omitempty"`
CoinsFrozen int64 `protobuf:"varint,5,opt,name=coinsFrozen,proto3" json:"coinsFrozen,omitempty"`
EmptyBlockInterval uint32 `protobuf:"varint,6,opt,name=emptyBlockInterval,proto3" json:"emptyBlockInterval,omitempty"`
MainHeight int64 `protobuf:"varint,7,opt,name=mainHeight,proto3" json:"mainHeight,omitempty"`
FromAddr string `protobuf:"bytes,8,opt,name=fromAddr,proto3" json:"fromAddr,omitempty"`
Height int64 `protobuf:"varint,9,opt,name=height,proto3" json:"height,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -868,6 +894,13 @@ func (m *ParaNodeGroupStatus) XXX_DiscardUnknown() {
var xxx_messageInfo_ParaNodeGroupStatus proto.InternalMessageInfo
func (m *ParaNodeGroupStatus) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *ParaNodeGroupStatus) GetStatus() int32 {
if m != nil {
return m.Status
......@@ -882,9 +915,9 @@ func (m *ParaNodeGroupStatus) GetTitle() string {
return ""
}
func (m *ParaNodeGroupStatus) GetApplyAddr() string {
func (m *ParaNodeGroupStatus) GetTargetAddrs() string {
if m != nil {
return m.ApplyAddr
return m.TargetAddrs
}
return ""
}
......@@ -917,6 +950,13 @@ func (m *ParaNodeGroupStatus) GetFromAddr() string {
return ""
}
func (m *ParaNodeGroupStatus) GetHeight() int64 {
if m != nil {
return m.Height
}
return 0
}
type ReceiptParaNodeGroupConfig struct {
Addr string `protobuf:"bytes,1,opt,name=addr,proto3" json:"addr,omitempty"`
Config *ParaNodeGroupConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
......@@ -983,8 +1023,9 @@ func (m *ReceiptParaNodeGroupConfig) GetCurrent() *ParaNodeGroupStatus {
// node query
type ReqParacrossNodeInfo struct {
Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
Status int32 `protobuf:"varint,3,opt,name=status,proto3" json:"status,omitempty"`
Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
Addr string `protobuf:"bytes,3,opt,name=addr,proto3" json:"addr,omitempty"`
Status int32 `protobuf:"varint,4,opt,name=status,proto3" json:"status,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1022,6 +1063,13 @@ func (m *ReqParacrossNodeInfo) GetTitle() string {
return ""
}
func (m *ReqParacrossNodeInfo) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *ReqParacrossNodeInfo) GetAddr() string {
if m != nil {
return m.Addr
......@@ -1037,10 +1085,10 @@ func (m *ReqParacrossNodeInfo) GetStatus() int32 {
}
type RespParacrossNodeAddrs struct {
Addrs []*ParaNodeAddrStatus `protobuf:"bytes,1,rep,name=addrs,proto3" json:"addrs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
Ids []*ParaNodeIdStatus `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *RespParacrossNodeAddrs) Reset() { *m = RespParacrossNodeAddrs{} }
......@@ -1068,15 +1116,15 @@ func (m *RespParacrossNodeAddrs) XXX_DiscardUnknown() {
var xxx_messageInfo_RespParacrossNodeAddrs proto.InternalMessageInfo
func (m *RespParacrossNodeAddrs) GetAddrs() []*ParaNodeAddrStatus {
func (m *RespParacrossNodeAddrs) GetIds() []*ParaNodeIdStatus {
if m != nil {
return m.Addrs
return m.Ids
}
return nil
}
type RespParacrossNodeGroups struct {
Addrs []*ParaNodeGroupStatus `protobuf:"bytes,1,rep,name=addrs,proto3" json:"addrs,omitempty"`
Ids []*ParaNodeGroupStatus `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1107,9 +1155,9 @@ func (m *RespParacrossNodeGroups) XXX_DiscardUnknown() {
var xxx_messageInfo_RespParacrossNodeGroups proto.InternalMessageInfo
func (m *RespParacrossNodeGroups) GetAddrs() []*ParaNodeGroupStatus {
func (m *RespParacrossNodeGroups) GetIds() []*ParaNodeGroupStatus {
if m != nil {
return m.Addrs
return m.Ids
}
return nil
}
......@@ -2477,9 +2525,9 @@ func init() {
proto.RegisterType((*ParacrossConsensusStatus)(nil), "types.ParacrossConsensusStatus")
proto.RegisterType((*ParaNodeAddrConfig)(nil), "types.ParaNodeAddrConfig")
proto.RegisterType((*ParaNodeVoteDetail)(nil), "types.ParaNodeVoteDetail")
proto.RegisterType((*ParaNodeAddrStatus)(nil), "types.ParaNodeAddrStatus")
proto.RegisterType((*ParaNodeAddrIdStatus)(nil), "types.ParaNodeAddrIdStatus")
proto.RegisterType((*ParaNodeIdStatus)(nil), "types.ParaNodeIdStatus")
proto.RegisterType((*ReceiptParaNodeConfig)(nil), "types.ReceiptParaNodeConfig")
proto.RegisterType((*ReceiptParaNodeVoteRecord)(nil), "types.ReceiptParaNodeVoteRecord")
proto.RegisterType((*ReceiptParaNodeVoteDone)(nil), "types.ReceiptParaNodeVoteDone")
proto.RegisterType((*ParaNodeGroupConfig)(nil), "types.ParaNodeGroupConfig")
proto.RegisterType((*ParaNodeGroupStatus)(nil), "types.ParaNodeGroupStatus")
......@@ -2508,116 +2556,119 @@ func init() {
func init() { proto.RegisterFile("paracross.proto", fileDescriptor_6a397e38c9ea6747) }
var fileDescriptor_6a397e38c9ea6747 = []byte{
// 1743 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x18, 0x4b, 0x6f, 0x1c, 0x45,
0x73, 0x67, 0x9f, 0xde, 0xb2, 0xbd, 0xb6, 0x3b, 0xb1, 0xb3, 0xd9, 0x2f, 0x5f, 0xb2, 0x1a, 0x05,
0x64, 0xa1, 0xe0, 0x04, 0x1b, 0x05, 0xa1, 0x08, 0x81, 0xe3, 0x24, 0x5e, 0x2b, 0x0f, 0x45, 0x63,
0xf3, 0xb8, 0x20, 0x31, 0x59, 0xb7, 0xed, 0x11, 0xbb, 0x33, 0x93, 0xe9, 0xde, 0xc4, 0xe6, 0x86,
0x04, 0xfc, 0x07, 0xce, 0x70, 0xe6, 0x47, 0x70, 0x84, 0x03, 0x12, 0xff, 0x00, 0x71, 0xe1, 0xc6,
0x5f, 0x40, 0x55, 0xdd, 0x33, 0xd3, 0x3d, 0xbb, 0x5e, 0x8c, 0x15, 0x09, 0x71, 0x9b, 0xaa, 0xae,
0xae, 0xf7, 0xab, 0x07, 0x16, 0x62, 0x3f, 0xf1, 0xfb, 0x49, 0x24, 0xc4, 0x5a, 0x9c, 0x44, 0x32,
0x62, 0x35, 0x79, 0x12, 0x73, 0xd1, 0x59, 0x92, 0x89, 0x1f, 0x0a, 0xbf, 0x2f, 0x83, 0x28, 0x54,
0x27, 0x9d, 0xb9, 0x7e, 0x34, 0x1c, 0x66, 0xd0, 0xe2, 0xb3, 0x41, 0xd4, 0xff, 0xbc, 0x7f, 0xe4,
0x07, 0x29, 0xa6, 0xc5, 0x8f, 0x79, 0x7f, 0x24, 0xa3, 0x44, 0xc1, 0xee, 0x23, 0x58, 0x79, 0x9a,
0x32, 0xdf, 0x95, 0xbe, 0x1c, 0x89, 0x7b, 0x5c, 0xfa, 0xc1, 0x40, 0xb0, 0x8b, 0x50, 0xf3, 0xf7,
0xf7, 0x13, 0xd1, 0x76, 0xba, 0x95, 0xd5, 0xa6, 0xa7, 0x00, 0x76, 0x05, 0x9a, 0xc4, 0xb3, 0xe7,
0x8b, 0xa3, 0x76, 0xb9, 0x5b, 0x59, 0x9d, 0xf3, 0x72, 0x84, 0xfb, 0xab, 0x03, 0xcb, 0x19, 0xbb,
0x1e, 0x0f, 0x0e, 0x8f, 0xa4, 0x62, 0xca, 0x56, 0xa0, 0x2e, 0xe8, 0xab, 0xed, 0x74, 0x9d, 0xd5,
0x9a, 0xa7, 0x21, 0x94, 0x22, 0x03, 0x39, 0xe0, 0xed, 0x72, 0xd7, 0x41, 0x29, 0x04, 0x20, 0xf5,
0x11, 0xdd, 0x6e, 0x57, 0xba, 0xce, 0x6a, 0xc5, 0xd3, 0x10, 0x7b, 0x07, 0x1a, 0xfb, 0x4a, 0xbd,
0x76, 0xb5, 0xeb, 0xac, 0xce, 0xae, 0xff, 0x7f, 0x8d, 0x3c, 0xb1, 0x36, 0xd9, 0x06, 0x2f, 0xa5,
0x66, 0x57, 0x01, 0x86, 0x7e, 0x10, 0x2a, 0x95, 0xda, 0x35, 0x62, 0x6a, 0x60, 0x58, 0x07, 0x66,
0x08, 0x42, 0xab, 0xea, 0x5d, 0x67, 0x75, 0xce, 0xcb, 0x60, 0xf7, 0x0f, 0x07, 0xda, 0x13, 0x8d,
0xf2, 0x44, 0xfc, 0x8a, 0xec, 0xb2, 0xd5, 0xab, 0x4e, 0x55, 0xaf, 0x46, 0x0c, 0x33, 0x98, 0x75,
0x61, 0x16, 0x63, 0x1e, 0xc8, 0x4d, 0x8a, 0x56, 0x9d, 0xa2, 0x65, 0xa2, 0xd8, 0x2a, 0x2c, 0x28,
0xf0, 0x6e, 0x16, 0xb9, 0x06, 0x51, 0x15, 0xd1, 0xee, 0xa7, 0xb0, 0x50, 0xf0, 0x64, 0x6e, 0x88,
0x33, 0xd9, 0x90, 0xb2, 0x65, 0x88, 0x95, 0x1e, 0x15, 0x72, 0xa4, 0x91, 0x1e, 0xdf, 0x9b, 0x9e,
0xdc, 0x8a, 0x42, 0xc1, 0x43, 0x31, 0x9a, 0x2e, 0x08, 0xad, 0x3b, 0xca, 0x5d, 0xa3, 0xa4, 0x99,
0x28, 0x76, 0x1d, 0xe6, 0xfb, 0x8a, 0x55, 0xcf, 0x74, 0xad, 0x8d, 0x64, 0x6f, 0xc0, 0xa2, 0x46,
0xe4, 0x4e, 0xa8, 0x92, 0xa0, 0x31, 0xbc, 0xfb, 0x8d, 0x03, 0x0c, 0xd5, 0x7c, 0x12, 0xed, 0x73,
0xf4, 0xe0, 0x56, 0x14, 0x1e, 0x04, 0x87, 0xa7, 0x28, 0xd8, 0x82, 0x72, 0x14, 0xeb, 0x28, 0x97,
0xa3, 0x98, 0x31, 0xa8, 0x62, 0xa5, 0x90, 0x16, 0x4d, 0x8f, 0xbe, 0xf1, 0xe6, 0x0b, 0x7f, 0x30,
0xe2, 0x5a, 0xa2, 0x02, 0x54, 0xe0, 0x82, 0x50, 0x3c, 0x48, 0xa2, 0x2f, 0x78, 0xa8, 0x93, 0xd2,
0x44, 0xb9, 0x1f, 0xe4, 0x7a, 0x7c, 0x14, 0x49, 0xae, 0xb2, 0xfa, 0x94, 0xc2, 0x44, 0x19, 0x91,
0xe4, 0x82, 0x8a, 0x12, 0x65, 0x20, 0xe0, 0xfe, 0x52, 0x30, 0xe5, 0x5c, 0xd5, 0x78, 0x05, 0x9a,
0x7e, 0x1c, 0x0f, 0x4e, 0x36, 0x73, 0xbb, 0x72, 0x44, 0xd1, 0x8c, 0xea, 0x98, 0x19, 0xec, 0x66,
0xaa, 0x5a, 0x8d, 0x6a, 0xf6, 0xb2, 0x51, 0xb3, 0xb6, 0x69, 0x5a, 0x6b, 0x4c, 0xf7, 0x83, 0x24,
0x1a, 0x92, 0xbc, 0xba, 0x4a, 0xf7, 0x14, 0x76, 0x7f, 0x74, 0x60, 0xd9, 0xe3, 0x7d, 0x1e, 0xc4,
0x32, 0x65, 0xa0, 0xe3, 0x93, 0x7a, 0xde, 0x31, 0x3c, 0xff, 0x16, 0xd4, 0xfb, 0x74, 0x4a, 0x16,
0x8d, 0xcb, 0xce, 0xc3, 0xeb, 0x69, 0x42, 0xf6, 0x26, 0x54, 0xe3, 0x84, 0xbf, 0x20, 0x43, 0x27,
0x5f, 0xd0, 0xd5, 0x4f, 0x64, 0x6c, 0x03, 0x1a, 0xfd, 0x51, 0x92, 0xf0, 0x50, 0xea, 0x96, 0x34,
0xe5, 0x46, 0x4a, 0xe9, 0x06, 0x70, 0xb9, 0x60, 0x03, 0x3a, 0xc1, 0xe3, 0xfd, 0x28, 0xd9, 0xb7,
0xac, 0x77, 0x6c, 0xeb, 0xf1, 0x0c, 0x5d, 0x44, 0x67, 0x2a, 0x46, 0x19, 0x9c, 0x67, 0x59, 0x85,
0x62, 0xaa, 0x00, 0xf7, 0x77, 0x07, 0x2e, 0x4d, 0x90, 0x75, 0x2f, 0x0a, 0xf9, 0x29, 0x19, 0x7d,
0x15, 0x40, 0xfa, 0xc9, 0x21, 0x97, 0x86, 0x14, 0x03, 0x43, 0xe7, 0x91, 0xf4, 0x07, 0xc8, 0x4a,
0x68, 0x61, 0x06, 0x06, 0xd3, 0x85, 0x20, 0x14, 0x43, 0x3e, 0xa9, 0x79, 0x39, 0x82, 0x5a, 0x59,
0x24, 0x24, 0x1d, 0xd6, 0xe8, 0x30, 0x83, 0x59, 0x1b, 0x1a, 0x68, 0x8d, 0x27, 0xa4, 0x0e, 0x7b,
0x0a, 0xa2, 0xcc, 0xfd, 0x28, 0xe4, 0xca, 0x8f, 0xed, 0x86, 0x92, 0x99, 0x63, 0xdc, 0xef, 0x1c,
0xb8, 0x90, 0x9a, 0xb7, 0x9d, 0x44, 0xa3, 0xf8, 0x8c, 0x35, 0x3b, 0x4f, 0x35, 0x9b, 0x55, 0x94,
0x4a, 0x6e, 0x5d, 0x51, 0x7f, 0x9f, 0xd8, 0x6b, 0xc0, 0xf8, 0x30, 0x96, 0x27, 0xd4, 0x3a, 0x76,
0x42, 0xc9, 0x93, 0x17, 0xfe, 0x80, 0xac, 0x9a, 0xf7, 0x26, 0x9c, 0xb8, 0x7f, 0x16, 0xb5, 0xfc,
0x57, 0xca, 0xf1, 0x1f, 0x6a, 0x5d, 0x18, 0x4e, 0xf5, 0x49, 0xc3, 0x29, 0xcb, 0xd7, 0x46, 0xa1,
0x5a, 0x7f, 0x72, 0xa0, 0x53, 0xc8, 0x3e, 0x33, 0x3c, 0x93, 0x4a, 0x76, 0xbd, 0x50, 0xb2, 0x9d,
0x42, 0x3d, 0x19, 0xf7, 0xb3, 0x9a, 0x5d, 0xb3, 0x6a, 0x76, 0xe2, 0x0d, 0xab, 0x68, 0xdf, 0x2e,
0x16, 0xed, 0xb4, 0x2b, 0x59, 0xd5, 0x7e, 0x02, 0x17, 0x3d, 0xfe, 0x3c, 0x1b, 0x60, 0x48, 0xb7,
0x13, 0x1e, 0x44, 0xa7, 0x24, 0x59, 0x6a, 0x5b, 0xd9, 0xb0, 0x2d, 0x0f, 0x74, 0xc5, 0x0c, 0xb4,
0xbb, 0x03, 0x2b, 0x1e, 0x17, 0xb1, 0xc5, 0x5a, 0xcd, 0xee, 0x9b, 0x66, 0xb3, 0x9f, 0xda, 0x5c,
0x14, 0x9d, 0xfb, 0x10, 0xcb, 0xbd, 0xc0, 0x8a, 0xac, 0x11, 0xec, 0x96, 0xcd, 0x6b, 0x9a, 0xcd,
0x9a, 0xd9, 0xd7, 0x0e, 0x2c, 0xe1, 0x31, 0x25, 0xc4, 0xfa, 0x63, 0x3f, 0x08, 0x1f, 0xfb, 0xb1,
0x31, 0xfc, 0x9d, 0xd3, 0x87, 0xbf, 0x32, 0x3b, 0x47, 0x14, 0xd2, 0xa8, 0x32, 0x75, 0xc7, 0xa9,
0xda, 0x3b, 0x8e, 0x7b, 0x4f, 0x4d, 0xb1, 0x5c, 0x0d, 0xf2, 0xfb, 0x1a, 0xd4, 0x02, 0xc9, 0x87,
0xa9, 0x3d, 0x6d, 0xc3, 0x1e, 0x4b, 0x61, 0x4f, 0x91, 0xb9, 0xbf, 0x55, 0x54, 0xf9, 0x65, 0x7e,
0xd1, 0xe5, 0x77, 0x1d, 0xe6, 0x51, 0x52, 0xbe, 0x18, 0x38, 0xb4, 0xb8, 0xd8, 0x48, 0xdc, 0xa2,
0x72, 0x84, 0xb9, 0x8d, 0x14, 0xd1, 0x79, 0x3e, 0x54, 0x26, 0xaf, 0x4c, 0x55, 0xcb, 0x6b, 0x2e,
0xcc, 0xc5, 0x09, 0xcf, 0x85, 0xd7, 0x48, 0xb8, 0x85, 0xb3, 0x3d, 0x5b, 0x2f, 0xac, 0x55, 0x9a,
0x03, 0x1a, 0xc3, 0xf5, 0x72, 0x97, 0x72, 0xc8, 0x70, 0xc8, 0x41, 0x64, 0x04, 0x33, 0x8a, 0x43,
0x86, 0x40, 0xdf, 0xcb, 0xe3, 0xad, 0x68, 0x14, 0x4a, 0xd1, 0x6e, 0x52, 0x23, 0xc8, 0x60, 0x75,
0xe6, 0x71, 0x31, 0x1a, 0xc8, 0x36, 0xa8, 0xd5, 0x38, 0x85, 0xb1, 0x61, 0xcb, 0x63, 0xe4, 0x20,
0xda, 0xb3, 0xf4, 0x16, 0x48, 0x41, 0xda, 0xca, 0xd0, 0xcd, 0x7b, 0xe9, 0xd5, 0x39, 0xe5, 0x53,
0x0b, 0x89, 0x9a, 0x6b, 0x84, 0x62, 0x32, 0x4f, 0x4c, 0x2c, 0x1c, 0xbb, 0x01, 0x4b, 0x61, 0x14,
0x6e, 0xd1, 0xa6, 0xba, 0x97, 0x2a, 0xd9, 0x22, 0x25, 0xc7, 0x0f, 0xdc, 0x87, 0xc6, 0x03, 0x44,
0x1d, 0x6d, 0xd2, 0xf3, 0x08, 0xdb, 0x8a, 0xd1, 0x63, 0xed, 0xec, 0x2f, 0x24, 0x44, 0x56, 0x96,
0x12, 0x2e, 0x66, 0xc7, 0x8f, 0x83, 0x90, 0x27, 0xe7, 0xe7, 0x85, 0xe9, 0x13, 0x88, 0x5d, 0x3e,
0x38, 0xc8, 0xf6, 0x5e, 0x4a, 0x9f, 0x19, 0xaf, 0x88, 0x76, 0x7f, 0xae, 0x1a, 0x5b, 0xb8, 0x96,
0x78, 0x1b, 0x9b, 0x22, 0x5a, 0xa3, 0x25, 0x5e, 0x29, 0x4a, 0x34, 0x6d, 0xed, 0x95, 0x3c, 0x4d,
0xcd, 0x36, 0xa0, 0x36, 0x44, 0xc5, 0x75, 0x67, 0xfc, 0x5f, 0xf1, 0x9a, 0x61, 0x55, 0xaf, 0xe4,
0x29, 0x5a, 0xf6, 0x1e, 0xcc, 0xfb, 0x42, 0x70, 0xb9, 0x87, 0xaf, 0xcb, 0x03, 0x9e, 0xe8, 0x1e,
0xb9, 0xac, 0x2f, 0x6f, 0xe2, 0x99, 0x48, 0x0f, 0x7b, 0x25, 0xcf, 0xa6, 0xce, 0xae, 0x7f, 0x1c,
0xc8, 0xa3, 0xfd, 0xc4, 0x7f, 0xa9, 0xd7, 0x3e, 0xfb, 0x7a, 0x7a, 0x98, 0x5d, 0x4f, 0x11, 0x6c,
0x03, 0x66, 0x64, 0x2a, 0xb8, 0x3e, 0x5d, 0x70, 0x46, 0x88, 0x97, 0x5e, 0xa6, 0xe2, 0x1a, 0xd3,
0xc5, 0x65, 0x84, 0xec, 0x3e, 0xb4, 0x52, 0x06, 0x7b, 0xd1, 0xfd, 0x63, 0xde, 0xa7, 0xc2, 0xc8,
0xbd, 0x64, 0xcb, 0x53, 0x24, 0xbd, 0x92, 0x57, 0xb8, 0xc4, 0xee, 0x00, 0x84, 0xd9, 0x16, 0x4a,
0xe5, 0x33, 0x6d, 0xcf, 0xec, 0x95, 0x3c, 0x83, 0x9c, 0x3d, 0x80, 0x85, 0xd0, 0x1e, 0x6a, 0x54,
0x64, 0x53, 0xc7, 0x5e, 0xaf, 0xe4, 0x15, 0x2f, 0xe1, 0x4a, 0x23, 0x4f, 0x28, 0xa3, 0x6a, 0x5e,
0x59, 0x9e, 0xdc, 0x6d, 0xe8, 0x65, 0x10, 0x27, 0xf0, 0x8a, 0x31, 0x81, 0x8d, 0x64, 0x39, 0x6d,
0xfa, 0xea, 0xd4, 0x2e, 0x9f, 0x39, 0xb5, 0x6f, 0x59, 0xd3, 0x77, 0x2c, 0x35, 0xad, 0x27, 0xb3,
0x9a, 0xbf, 0xb7, 0x8b, 0xf3, 0x77, 0xfa, 0xa5, 0x6c, 0x02, 0x3f, 0xb4, 0x76, 0xff, 0x3c, 0x83,
0xcf, 0x55, 0xdd, 0x5f, 0x95, 0x71, 0x9e, 0xdb, 0xdc, 0x68, 0x2d, 0xb6, 0x17, 0x5c, 0x67, 0x6c,
0xc1, 0xed, 0xc2, 0x2c, 0x41, 0xca, 0x8d, 0xda, 0xe9, 0x26, 0x8a, 0xbd, 0x0e, 0x2d, 0x5c, 0x6a,
0x77, 0xfd, 0x21, 0xd7, 0x44, 0x6a, 0xde, 0x17, 0xb0, 0xf9, 0xa4, 0xa8, 0x4e, 0x9e, 0x14, 0xb5,
0xe2, 0x7c, 0xcd, 0x7b, 0x78, 0x7d, 0x5a, 0x0f, 0x6f, 0x4c, 0xe9, 0xe1, 0x33, 0x76, 0x0f, 0x77,
0x3f, 0x1b, 0xcf, 0x0f, 0xfd, 0x10, 0x79, 0x45, 0xf9, 0xe1, 0xbe, 0x06, 0xb3, 0xd9, 0xf1, 0xde,
0x31, 0x9a, 0xa7, 0xa6, 0x84, 0x66, 0xac, 0x21, 0x77, 0x1b, 0x37, 0x97, 0x7c, 0xbd, 0xda, 0x43,
0x5f, 0x14, 0x27, 0xea, 0x59, 0x7e, 0x42, 0xb8, 0x5f, 0x96, 0x61, 0xc9, 0xda, 0x81, 0xfe, 0x5b,
0x51, 0x6d, 0x9e, 0x37, 0xaa, 0x4d, 0x23, 0xaa, 0xdb, 0x70, 0xc1, 0x72, 0x01, 0x79, 0x13, 0x4b,
0xb5, 0x4e, 0xda, 0x14, 0x77, 0xa6, 0x31, 0x77, 0x79, 0x9a, 0x4e, 0x95, 0x5c, 0x31, 0x2a, 0xa8,
0xd9, 0xe4, 0x98, 0x8c, 0xed, 0x80, 0xd6, 0x0f, 0xa0, 0x1f, 0xca, 0xd0, 0xca, 0x47, 0x1b, 0xb6,
0x57, 0x4c, 0x32, 0x7c, 0x2d, 0xa4, 0x49, 0x86, 0xdf, 0xd4, 0xcc, 0xa2, 0xf4, 0x9f, 0x8a, 0x8c,
0x30, 0x74, 0x41, 0xd6, 0xc2, 0xc9, 0xe9, 0x33, 0x9e, 0x81, 0x31, 0x32, 0xaa, 0x4a, 0x12, 0x35,
0x84, 0x78, 0x7f, 0x88, 0xbe, 0x4a, 0x5d, 0xae, 0x20, 0x94, 0xc9, 0xb1, 0xdd, 0x2b, 0x6f, 0xd3,
0x37, 0xad, 0xe6, 0x27, 0xc3, 0x67, 0xd1, 0x40, 0xbf, 0x61, 0x34, 0x64, 0x84, 0x0d, 0xac, 0xb0,
0xd1, 0x0f, 0x25, 0x0c, 0x37, 0x7a, 0x4b, 0xef, 0x83, 0xcb, 0x44, 0x31, 0x86, 0x47, 0xfd, 0x63,
0x3f, 0xf1, 0x35, 0xd5, 0x8a, 0x5a, 0x7d, 0x73, 0x0c, 0xae, 0x51, 0x62, 0xd4, 0xef, 0x73, 0x21,
0xda, 0x97, 0xc8, 0xb8, 0x14, 0x5c, 0xff, 0xb6, 0x02, 0xcd, 0xec, 0xe7, 0x2f, 0x7b, 0x1f, 0x66,
0xb6, 0xb9, 0xa4, 0x10, 0xb0, 0xc5, 0x2c, 0x72, 0xcf, 0x77, 0x65, 0x12, 0x84, 0x87, 0x9d, 0x6b,
0xe3, 0x3b, 0x81, 0xf5, 0x87, 0xcd, 0x2d, 0xb1, 0x77, 0x01, 0x1e, 0x05, 0x42, 0xea, 0x64, 0x98,
0xcf, 0x59, 0x3c, 0x09, 0x06, 0x9d, 0xce, 0xa4, 0x5c, 0x50, 0xa4, 0x6e, 0x89, 0x3d, 0x05, 0xb6,
0xcd, 0xc9, 0x28, 0xb3, 0x30, 0xaf, 0xe6, 0x2c, 0x26, 0x15, 0x6e, 0xe7, 0xd4, 0xfc, 0x72, 0x4b,
0x6c, 0x17, 0x5a, 0xa9, 0x35, 0x67, 0xe4, 0x76, 0x6d, 0xea, 0x94, 0x10, 0xb1, 0x5b, 0x62, 0x77,
0x60, 0x71, 0x9b, 0x4b, 0x4a, 0xad, 0x6c, 0xcb, 0x6c, 0xe5, 0x6c, 0x31, 0x2d, 0x3a, 0xcb, 0x45,
0x36, 0x44, 0xee, 0x96, 0xd8, 0x0d, 0xa8, 0xef, 0x88, 0xdd, 0x93, 0xb0, 0x5f, 0x74, 0xcd, 0x92,
0x06, 0x77, 0xc4, 0x96, 0x3f, 0x3a, 0x3c, 0x92, 0x1f, 0xc6, 0x6e, 0xe9, 0x59, 0x9d, 0xfe, 0xa0,
0x6f, 0xfc, 0x15, 0x00, 0x00, 0xff, 0xff, 0x3d, 0x57, 0x1a, 0xc4, 0x9e, 0x17, 0x00, 0x00,
// 1788 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xcd, 0x6f, 0x23, 0x4b,
0x11, 0xf7, 0xf8, 0xdb, 0x95, 0xd8, 0x49, 0xfa, 0x6d, 0xb2, 0xc6, 0x3c, 0xf2, 0xac, 0xd1, 0x03,
0x05, 0x58, 0x05, 0x5e, 0x16, 0x2d, 0x42, 0x4f, 0x08, 0xf6, 0xe5, 0xed, 0xc6, 0xd1, 0x7e, 0x68,
0xd5, 0x09, 0x70, 0x42, 0x62, 0xd6, 0xee, 0xc4, 0x23, 0xec, 0x99, 0xd9, 0xe9, 0xf6, 0x6e, 0xc2,
0x0d, 0x09, 0xfe, 0x05, 0x24, 0xc4, 0x95, 0x33, 0x17, 0xee, 0xfc, 0x01, 0x70, 0xe3, 0x3f, 0xe0,
0xc6, 0x9d, 0x03, 0x57, 0x54, 0xd5, 0x3d, 0x33, 0xdd, 0xe3, 0x0f, 0x56, 0x4b, 0x2e, 0xdc, 0x5c,
0xd5, 0xd5, 0x55, 0x5d, 0xbf, 0xfa, 0x1c, 0xc3, 0x4e, 0x12, 0xa4, 0xc1, 0x38, 0x8d, 0xa5, 0x3c,
0x4e, 0xd2, 0x58, 0xc5, 0xac, 0xa1, 0x6e, 0x13, 0x21, 0x07, 0x7b, 0x2a, 0x0d, 0x22, 0x19, 0x8c,
0x55, 0x18, 0x47, 0xfa, 0x64, 0xb0, 0x3d, 0x8e, 0xe7, 0xf3, 0x9c, 0xda, 0x7d, 0x3d, 0x8b, 0xc7,
0xbf, 0x1c, 0x4f, 0x83, 0x30, 0xe3, 0xf4, 0xc4, 0x8d, 0x18, 0x2f, 0x54, 0x9c, 0x6a, 0xda, 0x7f,
0x0e, 0x07, 0xaf, 0x32, 0xe5, 0x17, 0x2a, 0x50, 0x0b, 0xf9, 0xa5, 0x50, 0x41, 0x38, 0x93, 0xec,
0x1e, 0x34, 0x82, 0xc9, 0x24, 0x95, 0x7d, 0x6f, 0x58, 0x3b, 0xea, 0x70, 0x4d, 0xb0, 0x8f, 0xa1,
0x43, 0x3a, 0x47, 0x81, 0x9c, 0xf6, 0xab, 0xc3, 0xda, 0xd1, 0x36, 0x2f, 0x18, 0xfe, 0xdf, 0x3d,
0xd8, 0xcf, 0xd5, 0x8d, 0x44, 0x78, 0x3d, 0x55, 0x5a, 0x29, 0x3b, 0x80, 0xa6, 0xa4, 0x5f, 0x7d,
0x6f, 0xe8, 0x1d, 0x35, 0xb8, 0xa1, 0xd0, 0x8a, 0x0a, 0xd5, 0x4c, 0xf4, 0xab, 0x43, 0x0f, 0xad,
0x10, 0x81, 0xd2, 0x53, 0xba, 0xdd, 0xaf, 0x0d, 0xbd, 0xa3, 0x1a, 0x37, 0x14, 0xfb, 0x3e, 0xb4,
0x26, 0xfa, 0x79, 0xfd, 0xfa, 0xd0, 0x3b, 0xda, 0x3a, 0xf9, 0xda, 0x31, 0x21, 0x71, 0xbc, 0xda,
0x07, 0x9e, 0x49, 0xb3, 0x43, 0x80, 0x79, 0x10, 0x46, 0xfa, 0x49, 0xfd, 0x06, 0x29, 0xb5, 0x38,
0x6c, 0x00, 0x6d, 0xa2, 0xd0, 0xab, 0xe6, 0xd0, 0x3b, 0xda, 0xe6, 0x39, 0xed, 0xff, 0xd3, 0x83,
0xfe, 0x4a, 0xa7, 0xb8, 0x4c, 0xee, 0xc8, 0x2f, 0xf7, 0x79, 0xf5, 0x8d, 0xcf, 0x6b, 0x90, 0xc2,
0x9c, 0x66, 0x43, 0xd8, 0xc2, 0x98, 0x87, 0xea, 0x31, 0x45, 0xab, 0x49, 0xd1, 0xb2, 0x59, 0xec,
0x08, 0x76, 0x34, 0xf9, 0x45, 0x1e, 0xb9, 0x16, 0x49, 0x95, 0xd9, 0xfe, 0xcf, 0x61, 0xa7, 0x84,
0x64, 0xe1, 0x88, 0xb7, 0xda, 0x91, 0xaa, 0xe3, 0x88, 0x93, 0x1e, 0x35, 0x02, 0xd2, 0x4a, 0x8f,
0x3f, 0xda, 0x48, 0x9e, 0xc6, 0x91, 0x14, 0x91, 0x5c, 0x6c, 0x36, 0x84, 0xde, 0x4d, 0x0b, 0x68,
0xb4, 0x35, 0x9b, 0xc5, 0x3e, 0x85, 0xee, 0x58, 0xab, 0x1a, 0xd9, 0xd0, 0xba, 0x4c, 0xf6, 0x2d,
0xd8, 0x35, 0x8c, 0x02, 0x84, 0x3a, 0x19, 0x5a, 0xe2, 0xfb, 0xbf, 0xf3, 0x80, 0xe1, 0x33, 0x5f,
0xc6, 0x13, 0x81, 0x08, 0x9e, 0xc6, 0xd1, 0x55, 0x78, 0xbd, 0xe6, 0x81, 0x3d, 0xa8, 0xc6, 0x09,
0xbd, 0xab, 0xcb, 0xab, 0x71, 0x82, 0x74, 0x38, 0xa1, 0x37, 0x74, 0x78, 0x35, 0x9c, 0x30, 0x06,
0x75, 0xac, 0x1c, 0x63, 0x8c, 0x7e, 0xa3, 0xa6, 0xb7, 0xc1, 0x6c, 0x21, 0x28, 0x96, 0x5d, 0xae,
0x09, 0x1d, 0xc8, 0x30, 0x92, 0x4f, 0xd3, 0xf8, 0x57, 0x22, 0xa2, 0x34, 0x44, 0x57, 0x0b, 0x96,
0xff, 0xe3, 0xe2, 0x5d, 0x3f, 0x8d, 0x95, 0xd0, 0x59, 0xbe, 0xa6, 0x50, 0xd1, 0x46, 0xac, 0x84,
0xa4, 0x22, 0xed, 0x70, 0x4d, 0xf8, 0x8f, 0xe0, 0x9e, 0xed, 0xd9, 0xf9, 0xc4, 0x80, 0x7f, 0x08,
0x90, 0xa4, 0x71, 0x12, 0xcb, 0x60, 0x76, 0x3e, 0x31, 0x0e, 0x5a, 0x1c, 0xff, 0xdf, 0x1e, 0xec,
0x66, 0x17, 0xf3, 0x4b, 0xda, 0x55, 0x2f, 0x77, 0xb5, 0xa8, 0x85, 0xea, 0xea, 0x5a, 0xa8, 0xd9,
0xc0, 0x1d, 0x02, 0xa8, 0x20, 0xbd, 0x16, 0x94, 0xa4, 0x06, 0x1e, 0x8b, 0x53, 0x86, 0xa3, 0xb1,
0x04, 0x07, 0xfb, 0x4e, 0xe6, 0x62, 0x93, 0x7a, 0xc1, 0x57, 0xac, 0x5e, 0xe0, 0x42, 0x64, 0xbc,
0xc7, 0x32, 0xba, 0x4a, 0xe3, 0x39, 0x19, 0x6c, 0xe9, 0x32, 0xca, 0x68, 0x2b, 0xa3, 0xdb, 0x76,
0x46, 0xfb, 0x7f, 0xf1, 0x60, 0x9f, 0x8b, 0xb1, 0x08, 0x13, 0x95, 0x29, 0x36, 0xf9, 0x90, 0x45,
0xd6, 0xb3, 0x22, 0xfb, 0x19, 0x34, 0xc7, 0x74, 0x4a, 0x10, 0x2c, 0xbf, 0xa9, 0x48, 0x27, 0x6e,
0x04, 0xd9, 0xb7, 0xa1, 0x9e, 0xa4, 0xe2, 0x2d, 0x81, 0xb3, 0x75, 0x72, 0xbf, 0x74, 0x21, 0x03,
0x9b, 0x93, 0x10, 0xfb, 0x0c, 0x5a, 0xe3, 0x45, 0x9a, 0x8a, 0x48, 0x99, 0x06, 0xb8, 0x56, 0x3e,
0x93, 0xf3, 0xff, 0xe5, 0xc1, 0xfd, 0x92, 0x03, 0x84, 0x4c, 0x1c, 0x89, 0xa5, 0x08, 0xae, 0xee,
0x5a, 0x6e, 0xa4, 0x6a, 0x4b, 0x91, 0xc2, 0xf3, 0x58, 0x05, 0x33, 0x54, 0xad, 0x1b, 0x73, 0x83,
0x5b, 0x1c, 0x6c, 0x0a, 0x44, 0xa1, 0x59, 0x8a, 0x63, 0x83, 0x17, 0x0c, 0xea, 0x6d, 0xb1, 0x54,
0x74, 0xd8, 0xa4, 0xc3, 0x9c, 0x66, 0x7d, 0x68, 0x61, 0xe4, 0xb8, 0x54, 0x26, 0x5e, 0x19, 0x89,
0x36, 0x27, 0x71, 0x24, 0xb4, 0xb3, 0x14, 0xb2, 0x06, 0xb7, 0x38, 0xfe, 0x9f, 0x3d, 0xf8, 0x28,
0x73, 0xf7, 0x2c, 0x8d, 0x17, 0xc9, 0xff, 0x54, 0xc4, 0x79, 0x89, 0xe9, 0x34, 0x35, 0x25, 0xf6,
0xdf, 0x33, 0xf4, 0x18, 0x98, 0x98, 0x27, 0xea, 0x96, 0x7a, 0xcb, 0x79, 0xa4, 0x44, 0xfa, 0x36,
0x98, 0x91, 0x97, 0x5d, 0xbe, 0xe2, 0xc4, 0xff, 0x43, 0xb5, 0xf4, 0xea, 0x3b, 0xa9, 0xb4, 0x21,
0x6c, 0x15, 0xd1, 0xca, 0x7c, 0xb0, 0x59, 0x77, 0xef, 0x49, 0x69, 0xa2, 0xb5, 0x56, 0x4d, 0xb4,
0xbc, 0x14, 0xdb, 0x6b, 0x4b, 0xb1, 0xe3, 0x94, 0xe2, 0x5f, 0x3d, 0x18, 0x94, 0x32, 0xd9, 0x0e,
0xed, 0xaa, 0x7a, 0x3c, 0x29, 0xd5, 0xe3, 0xa0, 0x54, 0x2e, 0xd6, 0xfd, 0xbc, 0x20, 0x8f, 0x9d,
0x82, 0x5c, 0x79, 0xc3, 0xa9, 0xc9, 0xef, 0x95, 0x6b, 0x72, 0xd3, 0x95, 0xbc, 0x2c, 0xa7, 0x70,
0x8f, 0x8b, 0x37, 0xf9, 0x34, 0xa4, 0xda, 0x8d, 0xae, 0xe2, 0xf5, 0x09, 0x1a, 0x4e, 0x4c, 0x55,
0xda, 0x53, 0xa5, 0x66, 0xf9, 0x5a, 0x24, 0x45, 0xdd, 0x4e, 0x0a, 0xff, 0x14, 0x0e, 0xb8, 0x90,
0x89, 0x63, 0x4a, 0x87, 0xfd, 0x9b, 0x50, 0x0b, 0x27, 0x7a, 0x6e, 0x6c, 0xe8, 0x24, 0x28, 0xe3,
0x9f, 0x61, 0x13, 0x29, 0x29, 0x21, 0xbf, 0x24, 0x7b, 0x60, 0x6b, 0xd9, 0xe4, 0x3b, 0x29, 0xfa,
0xad, 0x07, 0x7b, 0x78, 0x48, 0xe9, 0x72, 0xf2, 0x22, 0x08, 0xa3, 0x17, 0x41, 0x62, 0x85, 0xdc,
0x5b, 0xbf, 0x4f, 0x68, 0xf7, 0x0b, 0x46, 0x29, 0xc9, 0x6a, 0x1b, 0xd7, 0xa6, 0xba, 0xbb, 0x36,
0xf9, 0x5f, 0xea, 0x59, 0x5a, 0x3c, 0x83, 0xd0, 0x3f, 0x86, 0x46, 0xa8, 0xc4, 0x3c, 0xf3, 0xa6,
0x6f, 0x79, 0xe3, 0x3c, 0x98, 0x6b, 0x31, 0xff, 0x1f, 0x35, 0x5d, 0xb0, 0x39, 0x26, 0xa6, 0x60,
0x3f, 0x85, 0x2e, 0x5a, 0x2a, 0x76, 0x0d, 0x8f, 0x76, 0x21, 0x97, 0x89, 0x8b, 0x59, 0xc1, 0xb0,
0x17, 0x9c, 0x32, 0x7b, 0x4d, 0x61, 0x17, 0xa8, 0xd5, 0x1d, 0xd4, 0x7c, 0xd8, 0x4e, 0x52, 0x51,
0x18, 0x6f, 0x90, 0x71, 0x87, 0xe7, 0x22, 0xdb, 0x2c, 0x6d, 0x6a, 0x46, 0x03, 0x3a, 0x23, 0xcc,
0xbe, 0x98, 0x69, 0xc8, 0x79, 0xa8, 0x41, 0xe6, 0x02, 0x6d, 0xad, 0x21, 0x67, 0x20, 0xf6, 0xea,
0xe6, 0x34, 0x5e, 0x44, 0x4a, 0x52, 0x19, 0x77, 0x79, 0x4e, 0xeb, 0x33, 0x2e, 0xe4, 0x62, 0xa6,
0xfa, 0xa0, 0xb7, 0xed, 0x8c, 0xc6, 0x96, 0xaf, 0x6e, 0x50, 0x83, 0xec, 0x6f, 0xd1, 0xe7, 0x45,
0x46, 0xd2, 0xa2, 0x87, 0x30, 0x5f, 0x66, 0x57, 0xb7, 0x35, 0xa6, 0x0e, 0x13, 0x5f, 0x6e, 0x18,
0x5a, 0x49, 0x97, 0x94, 0x38, 0x3c, 0xf6, 0x00, 0xf6, 0xa2, 0x38, 0x3a, 0xa5, 0xe5, 0xf7, 0x32,
0x7b, 0x64, 0x8f, 0x1e, 0xb9, 0x7c, 0xe0, 0x3f, 0xb3, 0xbe, 0x69, 0xf4, 0xd1, 0x63, 0xfa, 0xe2,
0xc2, 0xe6, 0x62, 0xed, 0xfe, 0x6e, 0xee, 0x97, 0x12, 0x22, 0x2f, 0x46, 0xa5, 0x17, 0x30, 0x3a,
0x7e, 0x11, 0x46, 0x22, 0xfd, 0x70, 0x5d, 0x98, 0x3e, 0xa1, 0xbc, 0x10, 0xb3, 0xab, 0x7c, 0x95,
0xa6, 0xf4, 0x69, 0xf3, 0x32, 0xdb, 0xff, 0x5b, 0xdd, 0x5a, 0xec, 0x8d, 0xc5, 0x47, 0xd8, 0x1a,
0xd1, 0x1b, 0x63, 0xf1, 0xe3, 0xb2, 0x45, 0xdb, 0xd7, 0x51, 0x85, 0x1b, 0x69, 0xf6, 0x10, 0x1a,
0x73, 0x7c, 0xb8, 0xe9, 0x8f, 0x5f, 0x2d, 0x5f, 0xb3, 0xbc, 0x1a, 0x55, 0xb8, 0x96, 0x65, 0x3f,
0x84, 0x6e, 0x20, 0xa5, 0x50, 0x97, 0xf8, 0xc1, 0x7a, 0x25, 0x52, 0xd3, 0x29, 0xf7, 0xcd, 0xe5,
0xc7, 0x78, 0x26, 0xb3, 0xc3, 0x51, 0x85, 0xbb, 0xd2, 0xf9, 0xf5, 0x9f, 0x85, 0x6a, 0x3a, 0x49,
0x83, 0x77, 0x94, 0xd1, 0xe5, 0xeb, 0xd9, 0x61, 0x7e, 0x3d, 0x63, 0xb0, 0x87, 0xd0, 0x56, 0x99,
0xe1, 0xe6, 0x66, 0xc3, 0xb9, 0x20, 0x5e, 0x7a, 0x97, 0x99, 0x6b, 0x6d, 0x36, 0x97, 0x0b, 0xb2,
0x27, 0xd0, 0xcb, 0x14, 0x5c, 0xc6, 0x4f, 0x6e, 0xc4, 0x98, 0x0a, 0xa3, 0x40, 0xc9, 0xb5, 0xa7,
0x45, 0x46, 0x15, 0x5e, 0xba, 0xc4, 0x3e, 0x07, 0x88, 0xf2, 0x45, 0x93, 0xca, 0x67, 0xd3, 0x2a,
0x39, 0xaa, 0x70, 0x4b, 0x9c, 0x3d, 0x85, 0x9d, 0xc8, 0x1d, 0x6d, 0x54, 0x64, 0x1b, 0x87, 0xdf,
0xa8, 0xc2, 0xcb, 0x97, 0x70, 0xe6, 0xa8, 0x5b, 0xb3, 0x60, 0x54, 0xd5, 0xed, 0x17, 0x2d, 0xf3,
0xd5, 0x82, 0x73, 0xf8, 0xc0, 0x9a, 0xc3, 0x56, 0xb2, 0xac, 0x9b, 0xc1, 0xd6, 0xb2, 0xf2, 0x7e,
0xa9, 0xfd, 0x5d, 0x67, 0x06, 0x2f, 0xa5, 0xa6, 0xf3, 0x15, 0xae, 0xa7, 0xf0, 0xa3, 0xf2, 0x14,
0xde, 0x7c, 0x29, 0x9f, 0xc3, 0xcf, 0x9c, 0xf5, 0xbe, 0xc8, 0xe0, 0x0f, 0xaa, 0xee, 0xdf, 0x54,
0x71, 0xaa, 0xbb, 0xda, 0x68, 0xd1, 0x76, 0x57, 0x64, 0x6f, 0x69, 0x45, 0xc6, 0x15, 0x0d, 0x29,
0x0d, 0xa3, 0x01, 0xdd, 0x66, 0xb1, 0x6f, 0x40, 0x0f, 0xd7, 0xe2, 0x8b, 0x60, 0x2e, 0x8c, 0x50,
0x8d, 0x84, 0x4a, 0xdc, 0x62, 0x52, 0xd4, 0x57, 0x4f, 0x8a, 0x46, 0x79, 0xbe, 0x16, 0x3d, 0xbc,
0xb9, 0xa9, 0x87, 0xb7, 0x36, 0xf4, 0xf0, 0xb6, 0xdb, 0xc3, 0xfd, 0x5f, 0x2c, 0xe7, 0x07, 0x17,
0xe3, 0x38, 0x9d, 0xdc, 0x55, 0x7e, 0xf8, 0x5f, 0x87, 0xad, 0xfc, 0xf8, 0xf2, 0x06, 0xdd, 0xd3,
0x53, 0xc2, 0x28, 0x36, 0x94, 0xde, 0x5a, 0x8a, 0x25, 0xeb, 0x12, 0xb1, 0x28, 0x4f, 0xd4, 0xf7,
0xf9, 0x5f, 0xc3, 0xff, 0x75, 0x15, 0xf6, 0x9c, 0xfd, 0xe7, 0xff, 0x2b, 0xaa, 0x9d, 0x0f, 0x8d,
0x6a, 0xc7, 0x8a, 0xea, 0x19, 0x7c, 0xe4, 0x40, 0x40, 0x68, 0x62, 0xa9, 0x36, 0xe9, 0x35, 0xe5,
0x9d, 0x69, 0x09, 0x2e, 0x6e, 0xe4, 0x74, 0xc9, 0x95, 0xa3, 0x82, 0x2f, 0x5b, 0x1d, 0x93, 0xa5,
0x1d, 0xd0, 0xf9, 0x4f, 0xe9, 0x4f, 0x55, 0xe8, 0x15, 0xa3, 0x0d, 0xdb, 0x2b, 0x26, 0x19, 0x7e,
0x4b, 0x64, 0x49, 0x86, 0xbf, 0xa9, 0x99, 0xc5, 0xd9, 0x02, 0xad, 0x62, 0x0c, 0x5d, 0x98, 0xb7,
0x70, 0x02, 0xbd, 0xcd, 0x2d, 0x8e, 0x95, 0x51, 0x75, 0xb2, 0x68, 0x28, 0xe4, 0x07, 0x73, 0xc4,
0x2a, 0x83, 0x5c, 0x53, 0x68, 0x53, 0x60, 0xbb, 0xd7, 0x68, 0xd3, 0x6f, 0x5a, 0xc8, 0x6f, 0xe7,
0xaf, 0xe3, 0x99, 0xf9, 0x78, 0x35, 0x94, 0x15, 0x36, 0x70, 0xc2, 0x46, 0xff, 0x51, 0x61, 0xb8,
0x11, 0x2d, 0xb3, 0x0f, 0xee, 0x93, 0xc4, 0x12, 0x9f, 0xfe, 0xb0, 0x09, 0xd2, 0xc0, 0x48, 0x1d,
0xe8, 0xd5, 0xb7, 0xe0, 0xe0, 0x1a, 0x25, 0x17, 0xe3, 0xb1, 0x90, 0xb2, 0x7f, 0x9f, 0x9c, 0xcb,
0xc8, 0x93, 0xdf, 0xd7, 0xa0, 0x93, 0xff, 0x9f, 0xcc, 0x7e, 0x04, 0xed, 0x33, 0xa1, 0x28, 0x04,
0x6c, 0x37, 0x8f, 0xdc, 0x9b, 0x0b, 0x95, 0x86, 0xd1, 0xf5, 0xe0, 0x93, 0xe5, 0x9d, 0xc0, 0xf9,
0xd3, 0xce, 0xaf, 0xb0, 0x1f, 0x00, 0x3c, 0x0f, 0xa5, 0x32, 0xc9, 0xd0, 0x2d, 0x54, 0xbc, 0x0c,
0x67, 0x83, 0xc1, 0xaa, 0x5c, 0xd0, 0xa2, 0x7e, 0x85, 0xbd, 0x02, 0x76, 0x26, 0xc8, 0x29, 0xbb,
0x30, 0x0f, 0x0b, 0x15, 0xab, 0x0a, 0x77, 0xb0, 0x36, 0xbf, 0xfc, 0x0a, 0xbb, 0x80, 0x5e, 0xe6,
0xcd, 0x7b, 0x6a, 0xfb, 0x64, 0xe3, 0x94, 0x90, 0x89, 0x5f, 0x61, 0x9f, 0xc3, 0xee, 0x99, 0x50,
0x94, 0x5a, 0xf9, 0x96, 0xd9, 0x2b, 0xd4, 0x62, 0x5a, 0x0c, 0xf6, 0xcb, 0x6a, 0x48, 0xdc, 0xaf,
0xb0, 0x07, 0xd0, 0x3c, 0x97, 0x17, 0xb7, 0xd1, 0xb8, 0x0c, 0xcd, 0x9e, 0x21, 0xcf, 0xe5, 0x69,
0xb0, 0xb8, 0x9e, 0xaa, 0x9f, 0x24, 0x7e, 0xe5, 0x75, 0x93, 0xfe, 0x94, 0x7f, 0xf8, 0x9f, 0x00,
0x00, 0x00, 0xff, 0xff, 0xd3, 0xee, 0x12, 0x0b, 0xf1, 0x17, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
......
......@@ -54,19 +54,18 @@ func (p *ParacrossType) GetName() string {
// GetLogMap get receipt log map
func (p *ParacrossType) GetLogMap() map[int64]*types.LogInfo {
return map[int64]*types.LogInfo{
TyLogParacrossCommit: {Ty: reflect.TypeOf(ReceiptParacrossCommit{}), Name: "LogParacrossCommit"},
TyLogParacrossCommitDone: {Ty: reflect.TypeOf(ReceiptParacrossDone{}), Name: "LogParacrossCommitDone"},
TyLogParacrossCommitRecord: {Ty: reflect.TypeOf(ReceiptParacrossRecord{}), Name: "LogParacrossCommitRecord"},
TyLogParaAssetWithdraw: {Ty: reflect.TypeOf(types.ReceiptAccountTransfer{}), Name: "LogParaAssetWithdraw"},
TyLogParaAssetTransfer: {Ty: reflect.TypeOf(types.ReceiptAccountTransfer{}), Name: "LogParaAssetTransfer"},
TyLogParaAssetDeposit: {Ty: reflect.TypeOf(types.ReceiptAccountTransfer{}), Name: "LogParaAssetDeposit"},
TyLogParacrossMiner: {Ty: reflect.TypeOf(ReceiptParacrossMiner{}), Name: "LogParacrossMiner"},
TyLogParaNodeConfig: {Ty: reflect.TypeOf(ReceiptParaNodeConfig{}), Name: "LogParaNodeConfig"},
TyLogParaNodeGroupUpdate: {Ty: reflect.TypeOf(types.ReceiptConfig{}), Name: "LogParaNodeGroupUpdate"},
TyLogParaNodeVoteDone: {Ty: reflect.TypeOf(ReceiptParaNodeVoteDone{}), Name: "LogParaNodeVoteDone"},
TyLogParaNodeGroupApply: {Ty: reflect.TypeOf(ReceiptParaNodeGroupConfig{}), Name: "LogParaNodeGroupApply"},
TyLogParaNodeGroupApprove: {Ty: reflect.TypeOf(ReceiptParaNodeGroupConfig{}), Name: "LogParaNodeGroupApprove"},
TyLogParaNodeGroupQuit: {Ty: reflect.TypeOf(ReceiptParaNodeGroupConfig{}), Name: "LogParaNodeGroupQuit"},
TyLogParacrossCommit: {Ty: reflect.TypeOf(ReceiptParacrossCommit{}), Name: "LogParacrossCommit"},
TyLogParacrossCommitDone: {Ty: reflect.TypeOf(ReceiptParacrossDone{}), Name: "LogParacrossCommitDone"},
TyLogParacrossCommitRecord: {Ty: reflect.TypeOf(ReceiptParacrossRecord{}), Name: "LogParacrossCommitRecord"},
TyLogParaAssetWithdraw: {Ty: reflect.TypeOf(types.ReceiptAccountTransfer{}), Name: "LogParaAssetWithdraw"},
TyLogParaAssetTransfer: {Ty: reflect.TypeOf(types.ReceiptAccountTransfer{}), Name: "LogParaAssetTransfer"},
TyLogParaAssetDeposit: {Ty: reflect.TypeOf(types.ReceiptAccountTransfer{}), Name: "LogParaAssetDeposit"},
TyLogParacrossMiner: {Ty: reflect.TypeOf(ReceiptParacrossMiner{}), Name: "LogParacrossMiner"},
TyLogParaNodeConfig: {Ty: reflect.TypeOf(ReceiptParaNodeConfig{}), Name: "LogParaNodeConfig"},
TyLogParaNodeGroupAddrsUpdate: {Ty: reflect.TypeOf(types.ReceiptConfig{}), Name: "LogParaNodeGroupAddrsUpdate"},
TyLogParaNodeVoteDone: {Ty: reflect.TypeOf(ReceiptParaNodeVoteDone{}), Name: "LogParaNodeVoteDone"},
TyLogParaNodeGroupConfig: {Ty: reflect.TypeOf(ReceiptParaNodeGroupConfig{}), Name: "LogParaNodeGroupConfig"},
TyLogParaNodeGroupStatusUpdate: {Ty: reflect.TypeOf(ReceiptParaNodeGroupConfig{}), Name: "LogParaNodeGroupStatusUpdate"},
}
}
......
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