Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
YottaChain
YTBP
提交
3a62db5d
Y
YTBP
项目概览
YottaChain
/
YTBP
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
YTBP
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
3a62db5d
编写于
7月 26, 2019
作者:
W
Wang Zhi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add some extra election policy
上级
ebe00945
变更
6
显示空白变更内容
内联
并排
Showing
6 changed file
with
217 addition
and
35 deletion
+217
-35
contracts/eosio.system/eosio.system.abi
contracts/eosio.system/eosio.system.abi
+14
-0
contracts/eosio.system/eosio.system.hpp
contracts/eosio.system/eosio.system.hpp
+15
-0
contracts/eosio.system/producer_pay.cpp
contracts/eosio.system/producer_pay.cpp
+22
-0
contracts/eosio.system/voting.cpp
contracts/eosio.system/voting.cpp
+161
-32
contracts/eosio.token/eosio.token.cpp
contracts/eosio.token/eosio.token.cpp
+3
-1
contracts/hddpool/hddpool.hpp
contracts/hddpool/hddpool.hpp
+2
-2
未找到文件。
contracts/eosio.system/eosio.system.abi
浏览文件 @
3a62db5d
...
...
@@ -322,6 +322,14 @@
{"name":"deposit_votes", "type":"int64"},
{"name":"unpaid_base_cnt", "type":"uint32"}
]
},{
"name": "master_sn_info",
"base": "",
"fields": [
{"name":"seq_num", "type":"uint16"},
{"name":"owner", "type":"account_name"},
{"name":"url", "type":"string"}
]
},{
"name": "producers_seq",
"base": "",
...
...
@@ -648,6 +656,12 @@
"index_type": "i64",
"key_names" : ["owner"],
"key_types" : ["uint64"]
},{
"name": "mastersnlist",
"type": "master_sn_info",
"index_type": "i64",
"key_names" : ["seq_num"],
"key_types" : ["uint64"]
},{
"name": "producerseq",
"type": "producers_seq",
...
...
contracts/eosio.system/eosio.system.hpp
浏览文件 @
3a62db5d
...
...
@@ -133,6 +133,17 @@ namespace eosiosystem {
EOSLIB_SERIALIZE
(
producers_seq
,
(
seq_num
)(
master
)(
voter_list
)(
prods_all
)
)
};
struct
master_sn_info
{
uint16_t
seq_num
=
1
;
// from 1 to 21
account_name
owner
;
std
::
string
url
;
uint64_t
primary_key
()
const
{
return
seq_num
;
}
EOSLIB_SERIALIZE
(
master_sn_info
,
(
seq_num
)(
owner
)(
url
))
};
typedef
eosio
::
multi_index
<
N
(
mastersnlist
),
master_sn_info
>
master_sn_list
;
//##YTA-Change end:
//##YTA-Change start:
...
...
@@ -335,6 +346,10 @@ namespace eosiosystem {
void
change_producer_seq_info
(
const
account_name
producer
,
const
eosio
::
public_key
&
producer_key
,
bool
isactive
,
bool
seturl
,
const
std
::
string
&
url
);
void
update_producers_seq_totalvotes
(
uint16_t
seq_num
,
account_name
owner
,
double
total_votes
);
void
delproducer
(
const
account_name
producer
);
void
elect_new_sn_master
(
uint16_t
seq_num
);
//##YTA-Change end:
// Implementation details:
...
...
contracts/eosio.system/producer_pay.cpp
浏览文件 @
3a62db5d
...
...
@@ -273,6 +273,28 @@ namespace eosiosystem {
uint32_t
total_unpaid_blocks
=
_gstate
.
total_unpaid_blocks
;
uint32_t
total_unpaid_base_cnt
=
_gstateex
.
total_unpaid_base_cnt
;
/*
//double total_producer_vote_weight = _gstate.total_producer_vote_weight;
uint32_t total_unpaid_blocks = 0;
uint32_t total_unpaid_base_cnt = 0;
double total_producer_vote_weight = 0;
for( auto it = _producers.begin(); it != _producers.end(); it++ ) {
total_unpaid_blocks += it->unpaid_blocks;
total_producer_vote_weight += it->total_votes;
}
for( auto it = _producersext.begin(); it != _producersext.end(); it++ ) {
total_unpaid_base_cnt += it->unpaid_base_cnt;
}
_gstate.total_unpaid_blocks = total_unpaid_blocks;
_gstateex.total_unpaid_base_cnt = total_unpaid_base_cnt;
_gstate.total_producer_vote_weight = total_producer_vote_weight;
*/
for
(
auto
it
=
_producers
.
begin
();
it
!=
_producers
.
end
();
it
++
)
{
if
(
!
(
it
->
active
()))
continue
;
...
...
contracts/eosio.system/voting.cpp
浏览文件 @
3a62db5d
...
...
@@ -18,6 +18,8 @@
#include <algorithm>
#include <cmath>
const
uint64_t
useconds_per_day_v
=
24
*
3600
*
uint64_t
(
1000000
);
namespace
eosiosystem
{
using
eosio
::
indexed_by
;
using
eosio
::
const_mem_fun
;
...
...
@@ -118,9 +120,8 @@ namespace eosiosystem {
_producersext
.
erase
(
_producersext
.
begin
());
}
for
(
uint16_t
seq
=
1
;
seq
<=
21
;
seq
++
)
{
producers_seq_table
_prod_seq
(
_self
,
seq
);
if
(
_prod_seq
.
begin
()
!=
_prod_seq
.
end
()
)
producers_seq_table
_prod_seq
(
_self
,
_self
);
while
(
_prod_seq
.
begin
()
!=
_prod_seq
.
end
())
{
_prod_seq
.
erase
(
_prod_seq
.
begin
());
}
...
...
@@ -129,7 +130,7 @@ namespace eosiosystem {
all_prods_singleton
_all_prods
(
_self
,
_self
);
all_prods_level
_all_prods_state
;
if
(
_all_prods
.
exists
())
if
(
_all_prods
.
exists
())
{
_all_prods_state
=
_all_prods
.
get
();
_all_prods_state
.
prods_l1
.
clear
();
_all_prods_state
.
prods_l2
.
clear
();
...
...
@@ -137,6 +138,77 @@ namespace eosiosystem {
_all_prods
.
set
(
_all_prods_state
,
_self
);
}
master_sn_list
_snlist
(
_self
,
_self
);
while
(
_snlist
.
begin
()
!=
_snlist
.
end
())
{
_snlist
.
erase
(
_snlist
.
begin
());
}
}
void
system_contract
::
delproducer
(
const
account_name
producer
)
{
auto
itp
=
_producers
.
find
(
producer
);
if
(
itp
!=
_producers
.
end
()
)
{
_gstate
.
total_unpaid_blocks
-=
itp
->
unpaid_blocks
;
_gstate
.
total_producer_vote_weight
-=
itp
->
total_votes
;
_producers
.
erase
(
itp
);
}
auto
itpex
=
_producersext
.
find
(
producer
);
uint16_t
seq_num
=
0
;
if
(
itpex
!=
_producersext
.
end
()
)
{
_gstateex
.
total_unpaid_base_cnt
-=
itpex
->
unpaid_base_cnt
;
seq_num
=
itpex
->
seq_num
;
_producersext
.
erase
(
itpex
);
}
else
{
return
;
}
bool
needNewSnMaster
=
false
;
master_sn_list
_snlist
(
_self
,
_self
);
auto
sn_itr
=
_snlist
.
find
(
seq_num
);
if
(
sn_itr
!=
_snlist
.
end
()
)
{
if
(
sn_itr
->
owner
==
producer
)
{
needNewSnMaster
=
true
;
}
}
rm_producer_seq
(
producer
,
seq_num
);
if
(
needNewSnMaster
)
{
elect_new_sn_master
(
seq_num
);
}
}
void
system_contract
::
elect_new_sn_master
(
uint16_t
seq_num
)
{
producers_seq_table
_prodseq
(
_self
,
_self
);
auto
ps_itr
=
_prodseq
.
find
(
seq_num
);
if
(
ps_itr
==
_prodseq
.
end
()
)
return
;
//account_name newMaster = 0;
_prodseq
.
modify
(
ps_itr
,
_self
,
[
&
](
producers_seq
&
info
){
std
::
sort
(
info
.
prods_all
.
begin
(),
info
.
prods_all
.
end
(),
[
&
](
prod_meta
lhs
,
prod_meta
rhs
){
return
lhs
.
total_votes
>
rhs
.
total_votes
;});
for
(
auto
it
=
info
.
prods_all
.
begin
();
it
!=
info
.
prods_all
.
end
();
it
++
)
{
if
(
it
->
is_active
&&
(
current_time
()
-
it
->
last_crash_time
)
>
useconds_per_day_v
)
{
//newMaster = it->owner;
info
.
master
=
it
->
owner
;
master_sn_list
_snlist
(
_self
,
_self
);
auto
sn_itr
=
_snlist
.
find
(
seq_num
);
if
(
sn_itr
==
_snlist
.
end
()
)
{
_snlist
.
emplace
(
_self
,
[
&
](
auto
&
row
)
{
row
.
seq_num
=
seq_num
;
row
.
owner
=
it
->
owner
;
row
.
url
=
it
->
url
;
});
}
else
{
_snlist
.
modify
(
sn_itr
,
_self
,
[
&
](
auto
&
row
)
{
row
.
owner
=
it
->
owner
;
row
.
url
=
it
->
url
;
});
}
}
}
});
}
void
system_contract
::
seqproducer
(
const
account_name
producer
,
uint16_t
seq
,
uint8_t
level
)
{
require_auth
(
_self
);
...
...
@@ -194,10 +266,9 @@ namespace eosiosystem {
}
producers_seq_table
_prodseq
(
_self
,
seq
);
producers_seq_table
_prodseq
(
_self
,
_self
);
auto
ps_itr
=
_prodseq
.
find
(
seq
);
if
(
ps_itr
==
_prodseq
.
end
()
)
return
;
if
(
ps_itr
!=
_prodseq
.
end
()
)
{
_prodseq
.
modify
(
ps_itr
,
_self
,
[
&
](
producers_seq
&
info
){
if
(
info
.
master
==
producer
)
{
info
.
master
=
0
;
...
...
@@ -209,9 +280,25 @@ namespace eosiosystem {
break
;
}
}
for
(
auto
itvoter
=
info
.
voter_list
.
begin
();
itvoter
!=
info
.
voter_list
.
end
();
itvoter
++
)
{
if
(
*
itvoter
==
producer
)
{
info
.
voter_list
.
erase
(
itvoter
);
break
;
}
}
});
}
master_sn_list
_snlist
(
_self
,
_self
);
auto
sn_itr
=
_snlist
.
find
(
seq
);
if
(
sn_itr
!=
_snlist
.
end
()
)
{
if
(
sn_itr
->
owner
==
producer
)
{
_snlist
.
erase
(
sn_itr
);
}
}
}
void
system_contract
::
add_producer_seq
(
const
account_name
producer
,
uint16_t
seq
,
uint8_t
level
)
{
//need retrive from system producers table
...
...
@@ -244,7 +331,7 @@ namespace eosiosystem {
_all_prods
.
set
(
_all_prods_state
,
_self
);
producers_seq_table
_prodseq
(
_self
,
seq
);
producers_seq_table
_prodseq
(
_self
,
_self
);
prod_meta
prodm
;
prodm
.
owner
=
producer
;
prodm
.
total_votes
=
prod
.
total_votes
;
...
...
@@ -269,6 +356,23 @@ namespace eosiosystem {
}
});
}
if
(
level
==
1
)
{
master_sn_list
_snlist
(
_self
,
_self
);
auto
sn_itr
=
_snlist
.
find
(
seq
);
if
(
sn_itr
==
_snlist
.
end
()
)
{
_snlist
.
emplace
(
_self
,
[
&
](
auto
&
row
)
{
row
.
seq_num
=
seq
;
row
.
owner
=
producer
;
row
.
url
=
prod
.
url
;
});
}
else
{
_snlist
.
modify
(
sn_itr
,
_self
,
[
&
](
auto
&
row
)
{
row
.
owner
=
producer
;
row
.
url
=
prod
.
url
;
});
}
}
}
void
system_contract
::
change_producer_seq_info
(
const
account_name
producer
,
const
eosio
::
public_key
&
producer_key
,
bool
isactive
,
bool
seturl
,
const
std
::
string
&
url
)
{
...
...
@@ -311,7 +415,7 @@ namespace eosiosystem {
if
(
it
==
_producersext
.
end
())
return
;
uint16_t
seq
=
it
->
seq_num
;
producers_seq_table
_prodseq
(
_self
,
seq
);
producers_seq_table
_prodseq
(
_self
,
_self
);
auto
ps_itr
=
_prodseq
.
find
(
seq
);
if
(
ps_itr
==
_prodseq
.
end
()
)
return
;
...
...
@@ -326,6 +430,17 @@ namespace eosiosystem {
}
});
master_sn_list
_snlist
(
_self
,
_self
);
auto
sn_itr
=
_snlist
.
find
(
seq
);
if
(
sn_itr
!=
_snlist
.
end
()
)
{
if
(
sn_itr
->
owner
==
producer
)
{
if
(
seturl
)
{
_snlist
.
modify
(
sn_itr
,
_self
,
[
&
](
auto
&
row
)
{
row
.
url
=
url
;
});
}
}
}
}
void
system_contract
::
update_producers_seq_totalvotes
(
uint16_t
seq_num
,
account_name
owner
,
double
total_votes
)
{
...
...
@@ -358,8 +473,7 @@ namespace eosiosystem {
_all_prods
.
set
(
_all_prods_state
,
_self
);
}
producers_seq_table
_prodseq
(
_self
,
seq_num
);
producers_seq_table
_prodseq
(
_self
,
_self
);
auto
ps_itr
=
_prodseq
.
find
(
seq_num
);
if
(
ps_itr
==
_prodseq
.
end
()
)
return
;
...
...
@@ -405,8 +519,6 @@ namespace eosiosystem {
}
const
uint64_t
useconds_per_day_v
=
24
*
3600
*
uint64_t
(
1000000
);
void
system_contract
::
update_elected_producers_yta
(
block_timestamp
block_time
)
{
all_prods_singleton
_all_prods
(
_self
,
_self
);
...
...
@@ -819,6 +931,8 @@ namespace eosiosystem {
}
}
account_name
producer_not_fount
=
0
;
for
(
const
auto
&
pd
:
producer_deltas
)
{
double
total_votes
=
0
;
auto
pitr
=
_producers
.
find
(
pd
.
first
);
...
...
@@ -834,24 +948,36 @@ namespace eosiosystem {
total_votes
=
p
.
total_votes
;
});
}
else
{
if
(
voting
)
{
eosio_assert
(
!
pd
.
second
.
second
/* not from new set */
,
"producer is not registered"
);
//data corruption
}
producer_not_fount
=
pd
.
first
;
}
//##YTA-Change start:
auto
pitr2
=
_producersext
.
find
(
pd
.
first
);
if
(
pitr2
!=
_producersext
.
end
()
)
{
//pitr2->seq_num
update_producers_seq_totalvotes
(
pitr2
->
seq_num
,
pd
.
first
,
total_votes
);
}
else
{
if
(
voting
)
{
eosio_assert
(
!
pd
.
second
.
second
/* not from new set */
,
"producer is not registered"
);
//data corruption
}
}
//##YTA-Change end:
}
//delete the last missing producer
_voters
.
modify
(
voter
,
0
,
[
&
](
auto
&
av
)
{
av
.
last_vote_weight
=
new_vote_weight
;
av
.
producers
=
producers
;
if
(
producer_not_fount
)
{
for
(
auto
it
=
av
.
producers
.
begin
();
it
!=
av
.
producers
.
end
();
it
++
)
{
if
(
*
it
==
producer_not_fount
)
{
av
.
producers
.
erase
(
it
);
break
;
}
}
}
av
.
proxy
=
proxy
;
});
}
...
...
@@ -866,6 +992,9 @@ namespace eosiosystem {
* @pre new state must be different than current state
*/
void
system_contract
::
regproxy
(
const
account_name
proxy
,
bool
isproxy
)
{
eosio_assert
(
1
==
2
,
"proxy not supported."
);
require_auth
(
proxy
);
auto
pitr
=
_voters
.
find
(
proxy
);
...
...
contracts/eosio.token/eosio.token.cpp
浏览文件 @
3a62db5d
...
...
@@ -116,7 +116,9 @@ void token::sub_balance_yta( account_name owner, asset value , account_name to)
const
auto
&
from
=
from_acnts
.
get
(
value
.
symbol
.
name
(),
"no balance object found"
);
//todo : need consider lock_token situation
if
(
to
==
N
(
eosio
.
stake
)
||
to
==
hdd_deposit_account
)
{
if
(
to
==
hdd_deposit_account
)
{
eosio_assert
(
from
.
balance
.
amount
>=
value
.
amount
,
"overdrawn balance"
);
}
else
if
(
to
==
N
(
eosio
.
stake
)
)
{
//forfeit can not use to delegatebw and vote
auto
deposit_and_forfeit
=
hdddeposit
(
hdd_deposit_account
).
get_deposit_and_forfeit
(
owner
);
eosio_assert
(
deposit_and_forfeit
.
symbol
==
value
.
symbol
,
"symbol precision mismatch"
);
...
...
contracts/hddpool/hddpool.hpp
浏览文件 @
3a62db5d
...
...
@@ -129,8 +129,8 @@ private:
struct
minerinfo
{
uint64_t
minerid
;
name
owner
;
name
admin
;
name
owner
;
//收益账号
name
admin
;
//管理员账号
name
pool_id
;
uint64_t
max_space
;
uint64_t
space_left
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录