Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
YottaChain
YTBP
提交
fbd30bad
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,发现更多精彩内容 >>
提交
fbd30bad
编写于
7月 19, 2019
作者:
W
Wang Zhi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement YTA chain BP election policy
上级
77b5f254
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
156 addition
and
3 deletion
+156
-3
contracts/eosio.system/eosio.system.hpp
contracts/eosio.system/eosio.system.hpp
+29
-0
contracts/eosio.system/voting.cpp
contracts/eosio.system/voting.cpp
+127
-3
未找到文件。
contracts/eosio.system/eosio.system.hpp
浏览文件 @
fbd30bad
...
...
@@ -136,6 +136,33 @@ namespace eosiosystem {
};
//##YTA-Change end:
//##YTA-Change start:
struct
yta_prod_info
{
account_name
owner
;
double
total_votes
=
0
;
// total votes
eosio
::
public_key
producer_key
;
/// a packed public key object
int64_t
all_stake
=
0
;
// total original votes (buy yta amount)
bool
is_active
=
true
;
std
::
string
url
;
uint16_t
location
=
0
;
bool
is_in_grace
;
//是否处在补齐投票的宽限期
uint64_t
grace_start_time
=
0
;
//宽限期的开始时间
EOSLIB_SERIALIZE
(
yta_prod_info
,
(
owner
)(
total_votes
)(
producer_key
)(
all_stake
)(
is_active
)(
url
)(
location
)(
is_in_grace
)(
grace_start_time
)
)
};
struct
all_prods_level
{
std
::
vector
<
yta_prod_info
>
prods_l1
;
//max 21
std
::
vector
<
yta_prod_info
>
prods_l2
;
//max 105
std
::
vector
<
yta_prod_info
>
prods_l3
;
EOSLIB_SERIALIZE
(
all_prods_level
,
(
prods_l1
)(
prods_l2
)(
prods_l3
)
)
};
typedef
eosio
::
singleton
<
N
(
all_prods
),
all_prods_level
>
all_prods_singleton
;
//##YTA-Change end:
struct
voter_info
{
account_name
owner
=
0
;
/// the voter
account_name
proxy
=
0
;
/// the proxy set by the voter, if any
...
...
@@ -300,6 +327,8 @@ namespace eosiosystem {
void
update_elected_producers
(
block_timestamp
timestamp
);
//##YTA-Change start:
void
update_elected_producers_yta2
(
block_timestamp
timestamp
);
void
update_elected_producers_yta
(
block_timestamp
timestamp
);
std
::
pair
<
eosio
::
producer_key
,
uint16_t
>
getProducerForSeq
(
uint64_t
seq_num
);
...
...
contracts/eosio.system/voting.cpp
浏览文件 @
fbd30bad
...
...
@@ -401,6 +401,130 @@ namespace eosiosystem {
}
const
uint64_t
useconds_per_day_v
=
24
*
3600
*
uint64_t
(
1000000
);
void
system_contract
::
update_elected_producers_yta2
(
block_timestamp
block_time
)
{
all_prods_singleton
_all_prods
(
_self
,
_self
);
all_prods_level
_all_prods_state
;
if
(
!
_all_prods
.
exists
())
return
;
for
(
auto
it
=
_all_prods_state
.
prods_l1
.
begin
();
it
!=
_all_prods_state
.
prods_l1
.
end
();
it
++
)
{
bool
is_remove
=
false
;
if
(
!
it
->
is_active
)
is_remove
=
true
;
if
(
it
->
total_votes
<
50000000000
)
{
if
(
it
->
is_in_grace
)
{
if
(
current_time
()
-
it
->
grace_start_time
>
useconds_per_day_v
)
{
is_remove
=
true
;
it
->
is_in_grace
=
false
;
}
}
else
{
it
->
is_in_grace
=
true
;
auto
ct
=
current_time
();
it
->
grace_start_time
=
ct
;
}
}
else
{
it
->
is_in_grace
=
false
;
}
if
(
is_remove
)
{
_all_prods_state
.
prods_l3
.
push_back
(
*
it
);
_all_prods_state
.
prods_l1
.
erase
(
it
);
}
}
for
(
auto
it
=
_all_prods_state
.
prods_l2
.
begin
();
it
!=
_all_prods_state
.
prods_l2
.
end
();
it
++
)
{
bool
is_remove
=
false
;
if
(
!
it
->
is_active
)
is_remove
=
true
;
if
(
it
->
total_votes
<
20000000000
)
{
if
(
it
->
is_in_grace
)
{
if
(
current_time
()
-
it
->
grace_start_time
>
useconds_per_day_v
)
{
is_remove
=
true
;
it
->
is_in_grace
=
false
;
}
}
else
{
it
->
is_in_grace
=
true
;
auto
ct
=
current_time
();
it
->
grace_start_time
=
ct
;
}
}
else
{
it
->
is_in_grace
=
false
;
}
if
(
is_remove
)
{
_all_prods_state
.
prods_l3
.
push_back
(
*
it
);
_all_prods_state
.
prods_l2
.
erase
(
it
);
}
}
std
::
sort
(
_all_prods_state
.
prods_l2
.
begin
(),
_all_prods_state
.
prods_l2
.
end
(),
[
&
](
yta_prod_info
lhs
,
yta_prod_info
rhs
){
return
lhs
.
total_votes
>
rhs
.
total_votes
;});
for
(
auto
it
=
_all_prods_state
.
prods_l2
.
begin
();
it
!=
_all_prods_state
.
prods_l2
.
end
();
it
++
)
{
if
(
it
->
total_votes
>=
50000000000
)
{
if
(
_all_prods_state
.
prods_l1
.
size
()
<
21
)
{
_all_prods_state
.
prods_l1
.
push_back
(
*
it
);
_all_prods_state
.
prods_l2
.
erase
(
it
);
}
else
{
break
;
}
}
}
std
::
sort
(
_all_prods_state
.
prods_l3
.
begin
(),
_all_prods_state
.
prods_l3
.
end
(),
[
&
](
yta_prod_info
lhs
,
yta_prod_info
rhs
){
return
lhs
.
total_votes
>
rhs
.
total_votes
;});
for
(
auto
it
=
_all_prods_state
.
prods_l3
.
begin
();
it
!=
_all_prods_state
.
prods_l3
.
end
();
it
++
)
{
if
(
it
->
total_votes
>=
20000000000
)
{
if
(
_all_prods_state
.
prods_l3
.
size
()
<
105
)
{
_all_prods_state
.
prods_l2
.
push_back
(
*
it
);
_all_prods_state
.
prods_l3
.
erase
(
it
);
}
else
{
break
;
}
}
}
_all_prods
.
set
(
_all_prods_state
,
_self
);
///---------------------------------------------------
_gstate
.
last_producer_schedule_update
=
block_time
;
std
::
vector
<
std
::
pair
<
eosio
::
producer_key
,
uint16_t
>
>
top_producers
;
top_producers
.
reserve
(
21
);
for
(
auto
it
=
_all_prods_state
.
prods_l1
.
begin
();
it
!=
_all_prods_state
.
prods_l1
.
end
();
it
++
)
{
top_producers
.
emplace_back
(
std
::
pair
<
eosio
::
producer_key
,
uint16_t
>
({{
it
->
owner
,
it
->
producer_key
},
it
->
location
})
);
}
if
(
top_producers
.
size
()
<
_gstate
.
last_producer_schedule_size
)
{
if
(
top_producers
.
size
()
<
7
)
return
;
}
/// sort by producer name
std
::
sort
(
top_producers
.
begin
(),
top_producers
.
end
()
);
std
::
vector
<
eosio
::
producer_key
>
producers
;
producers
.
reserve
(
top_producers
.
size
());
for
(
const
auto
&
item
:
top_producers
)
producers
.
push_back
(
item
.
first
);
bytes
packed_schedule
=
pack
(
producers
);
if
(
set_proposed_producers
(
packed_schedule
.
data
(),
packed_schedule
.
size
()
)
>=
0
)
{
_gstate
.
last_producer_schedule_size
=
static_cast
<
decltype
(
_gstate
.
last_producer_schedule_size
)
>
(
top_producers
.
size
()
);
}
}
void
system_contract
::
update_elected_producers_yta
(
block_timestamp
block_time
)
{
_gstate
.
last_producer_schedule_update
=
block_time
;
...
...
@@ -536,8 +660,8 @@ namespace eosiosystem {
void
system_contract
::
voteproducer
(
const
account_name
voter_name
,
const
account_name
proxy
,
const
std
::
vector
<
account_name
>&
producers
)
{
require_auth
(
voter_name
);
///@@@@@@@@@@@@@@@@@@@@@
eosio_assert
(
1
==
2
,
"can not vote now."
);
return
;
//
eosio_assert(1 == 2, "can not vote now.");
//
return;
///@@@@@@@@@@@@@@@@@@@@
update_votes
(
voter_name
,
proxy
,
producers
,
true
);
...
...
@@ -553,7 +677,7 @@ namespace eosiosystem {
//##YTA-Change start:
//eosio_assert( producers.size() <= 30, "attempt to vote for too many producers" );
// One voter can only vote for one producer
eosio_assert
(
producers
.
size
()
<=
1
,
"attempt to vote for too many producers"
);
eosio_assert
(
producers
.
size
()
<=
30
,
"attempt to vote for too many producers"
);
//##YTA-Change end:
for
(
size_t
i
=
1
;
i
<
producers
.
size
();
++
i
)
{
eosio_assert
(
producers
[
i
-
1
]
<
producers
[
i
],
"producer votes must be unique and sorted"
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录