Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
YottaChain
YTBP
提交
7e369333
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,发现更多精彩内容 >>
提交
7e369333
编写于
7月 04, 2019
作者:
W
Wang Zhi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add base reward for BP
上级
83d9869f
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
171 addition
and
19 deletion
+171
-19
contracts/eosio.system/eosio.system.cpp
contracts/eosio.system/eosio.system.cpp
+6
-3
contracts/eosio.system/eosio.system.hpp
contracts/eosio.system/eosio.system.hpp
+18
-8
contracts/eosio.system/producer_pay.cpp
contracts/eosio.system/producer_pay.cpp
+142
-6
contracts/eosio.system/voting.cpp
contracts/eosio.system/voting.cpp
+5
-2
未找到文件。
contracts/eosio.system/eosio.system.cpp
浏览文件 @
7e369333
...
...
@@ -13,12 +13,14 @@ namespace eosiosystem {
:
native
(
s
),
_voters
(
_self
,
_self
),
_producers
(
_self
,
_self
),
_producersext
(
_self
,
_self
),
_global
(
_self
,
_self
),
_rammarket
(
_self
,
_self
)
_rammarket
(
_self
,
_self
),
_producersext
(
_self
,
_self
),
_globalex
(
_self
,
_self
)
{
//print( "construct system\n" );
_gstate
=
_global
.
exists
()
?
_global
.
get
()
:
get_default_parameters
();
_gstateex
=
_globalex
.
exists
()
?
_globalex
.
get
()
:
eosio_global_state2
{};
auto
itr
=
_rammarket
.
find
(
S
(
4
,
RAMCORE
));
...
...
@@ -49,6 +51,7 @@ namespace eosiosystem {
system_contract
::~
system_contract
()
{
//print( "destruct system\n" );
_global
.
set
(
_gstate
,
_self
);
_globalex
.
set
(
_gstateex
,
_self
);
//eosio_exit(0);
}
...
...
@@ -208,5 +211,5 @@ EOSIO_ABI( eosiosystem::system_contract,
// voting.cpp
(
regproducer
)(
unregprod
)(
voteproducer
)(
regproxy
)(
clsprods2
)(
seqproducer
)(
testnewelec
)
// producer_pay.cpp
(
onblock
)(
claimrewards
)
(
onblock
)(
claimrewards
)
(
rewardprods
)
)
contracts/eosio.system/eosio.system.hpp
浏览文件 @
7e369333
...
...
@@ -62,6 +62,14 @@ namespace eosiosystem {
};
//##YTA-Change start:
struct
eosio_global_state2
{
int64_t
perbase_bucket
=
0
;
uint32_t
total_unpaid_base_cnt
=
0
;
uint64_t
last_claim_time
=
0
;
EOSLIB_SERIALIZE
(
eosio_global_state2
,
(
perbase_bucket
)(
total_unpaid_base_cnt
)(
last_claim_time
))
};
struct
eosio_global_count
{
uint64_t
total_accounts
=
1
;
...
...
@@ -94,9 +102,10 @@ namespace eosiosystem {
account_name
owner
;
uint16_t
seq_num
=
1
;
// from 1 to 21
int64_t
out_votes
=
0
;
uint32_t
unpaid_base_cnt
=
0
;
uint64_t
primary_key
()
const
{
return
owner
;
}
EOSLIB_SERIALIZE
(
producer_info_ext
,
(
owner
)(
seq_num
)(
out_votes
))
EOSLIB_SERIALIZE
(
producer_info_ext
,
(
owner
)(
seq_num
)(
out_votes
)
(
unpaid_base_cnt
)
)
};
...
...
@@ -125,8 +134,6 @@ namespace eosiosystem {
EOSLIB_SERIALIZE
(
producers_seq
,
(
seq_num
)(
is_org
)(
prods_l1
)(
prods_l2
)(
prods_l3
)(
prods_all
)
)
};
//struct remove
//##YTA-Change end:
struct
voter_info
{
...
...
@@ -172,10 +179,10 @@ namespace eosiosystem {
typedef
eosio
::
multi_index
<
N
(
producerseq
),
producers_seq
>
producers_seq_table
;
//##YTA-Change end:
typedef
eosio
::
singleton
<
N
(
global
),
eosio_global_state
>
global_state_singleton
;
//##YTA-Change start:
typedef
eosio
::
singleton
<
N
(
globalext
),
eosio_global_state2
>
global_state2_singleton
;
typedef
eosio
::
singleton
<
N
(
gcount
),
eosio_global_count
>
global_count_singleton
;
//##YTA-Change end:
...
...
@@ -187,14 +194,16 @@ namespace eosiosystem {
private:
voters_table
_voters
;
producers_table
_producers
;
//##YTA-Change start:
producers_ext_table
_producersext
;
//##YTA-Change end:
global_state_singleton
_global
;
eosio_global_state
_gstate
;
rammarket
_rammarket
;
//##YTA-Change start:
producers_ext_table
_producersext
;
eosio_global_state2
_gstateex
;
global_state2_singleton
_globalex
;
//##YTA-Change end:
public:
system_contract
(
account_name
s
);
~
system_contract
();
...
...
@@ -280,6 +289,7 @@ namespace eosiosystem {
// functions defined in producer_pay.cpp
void
claimrewards
(
const
account_name
&
owner
);
void
rewardprods
();
void
setpriv
(
account_name
account
,
uint8_t
ispriv
);
...
...
contracts/eosio.system/producer_pay.cpp
浏览文件 @
7e369333
...
...
@@ -64,6 +64,18 @@ namespace eosiosystem {
});
}
//##YTA-Change start:
if
(
timestamp
.
slot
-
_gstate
.
last_producer_schedule_update
.
slot
>
120
)
{
for
(
auto
it
=
_producersext
.
begin
();
it
!=
_producersext
.
end
();
it
++
)
{
_producersext
.
modify
(
it
,
0
,
[
&
](
auto
&
p
)
{
p
.
unpaid_base_cnt
++
;
});
_gstateex
.
total_unpaid_base_cnt
++
;
}
}
//##YTA-Change end:
//##YTA-Change start:
/// only update block producers once every minute, block_timestamp is in half seconds
//if( timestamp.slot - _gstate.last_producer_schedule_update.slot > 120 ) {
...
...
@@ -95,10 +107,10 @@ namespace eosiosystem {
using
namespace
eosio
;
void
system_contract
::
claimrewards
(
const
account_name
&
owner
)
{
require_auth
(
owner
);
require_auth
(
_self
);
//require_auth(owner);
//@@@@@@@@@@@@@@@@@@@@
return
;
const
auto
&
prod
=
_producers
.
get
(
owner
);
eosio_assert
(
prod
.
active
(),
"producer does not have an active key"
);
...
...
@@ -128,13 +140,16 @@ namespace eosiosystem {
if
(
usecs_since_last_fill
>
0
&&
_gstate
.
last_pervote_bucket_fill
>
0
)
{
auto
new_tokens
=
static_cast
<
int64_t
>
(
seo_token
*
YTA_PRECISION
*
double
(
usecs_since_last_fill
)
/
double
(
useconds_per_year
));
print
(
"new_token: "
,
new_tokens
,
"
\n
"
);
auto
to_producers
=
new_tokens
;
auto
to_per_base_pay
=
new_tokens
/
5
;
auto
to_producers
=
new_tokens
-
to_per_base_pay
;
auto
to_per_block_pay
=
to_producers
/
4
;
auto
to_per_vote_pay
=
to_producers
-
to_per_block_pay
;
INLINE_ACTION_SENDER
(
eosio
::
token
,
issue
)(
N
(
eosio
.
token
),
{{
N
(
eosio
),
N
(
active
)}},
{
N
(
eosio
),
asset
(
new_tokens
),
std
::
string
(
"issue tokens for producer pay
and savings
"
)}
);
{
N
(
eosio
),
asset
(
new_tokens
),
std
::
string
(
"issue tokens for producer pay"
)}
);
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
eosio
),
N
(
active
)},
{
N
(
eosio
),
N
(
hddbasefound
),
asset
(
to_per_base_pay
),
"fund per-base bucket"
}
);
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
eosio
),
N
(
active
)},
{
N
(
eosio
),
N
(
eosio
.
bpay
),
asset
(
to_per_block_pay
),
"fund per-block bucket"
}
);
...
...
@@ -142,12 +157,20 @@ namespace eosiosystem {
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
eosio
),
N
(
active
)},
{
N
(
eosio
),
N
(
eosio
.
vpay
),
asset
(
to_per_vote_pay
),
"fund per-vote bucket"
}
);
_gstate
.
pervote_bucket
+=
to_per_vote_pay
;
_gstate
.
perblock_bucket
+=
to_per_block_pay
;
_gstateex
.
perbase_bucket
+=
to_per_base_pay
;
_gstate
.
pervote_bucket
+=
to_per_vote_pay
;
_gstate
.
perblock_bucket
+=
to_per_block_pay
;
_gstate
.
last_pervote_bucket_fill
=
ct
;
}
const
auto
&
prodext
=
_producersext
.
get
(
owner
);
int64_t
producer_per_base_pay
=
0
;
if
(
_gstateex
.
total_unpaid_base_cnt
>
0
)
{
producer_per_base_pay
=
(
_gstateex
.
perbase_bucket
*
prodext
.
unpaid_base_cnt
)
/
_gstateex
.
total_unpaid_base_cnt
;
}
int64_t
producer_per_block_pay
=
0
;
if
(
_gstate
.
total_unpaid_blocks
>
0
)
{
producer_per_block_pay
=
(
_gstate
.
perblock_bucket
*
prod
.
unpaid_blocks
)
/
_gstate
.
total_unpaid_blocks
;
...
...
@@ -159,15 +182,26 @@ namespace eosiosystem {
if
(
producer_per_vote_pay
<
min_pervote_daily_pay
)
{
producer_per_vote_pay
=
0
;
}
_gstateex
.
perbase_bucket
-=
producer_per_base_pay
;
_gstate
.
pervote_bucket
-=
producer_per_vote_pay
;
_gstate
.
perblock_bucket
-=
producer_per_block_pay
;
_gstate
.
total_unpaid_blocks
-=
prod
.
unpaid_blocks
;
_gstateex
.
total_unpaid_base_cnt
-=
prodext
.
unpaid_base_cnt
;
_producers
.
modify
(
prod
,
0
,
[
&
](
auto
&
p
)
{
p
.
last_claim_time
=
ct
;
p
.
unpaid_blocks
=
0
;
});
_producersext
.
modify
(
prodext
,
0
,
[
&
](
auto
&
p
)
{
p
.
unpaid_base_cnt
=
0
;
});
if
(
producer_per_base_pay
>
0
)
{
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
hddbasefound
),
N
(
active
)},
{
N
(
hddbasefound
),
owner
,
asset
(
producer_per_base_pay
),
std
::
string
(
"producer base pay"
)
}
);
}
if
(
producer_per_block_pay
>
0
)
{
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
eosio
.
bpay
),
N
(
active
)},
{
N
(
eosio
.
bpay
),
owner
,
asset
(
producer_per_block_pay
),
std
::
string
(
"producer block pay"
)
}
);
...
...
@@ -178,4 +212,106 @@ namespace eosiosystem {
}
}
void
system_contract
::
rewardprods
(
)
{
require_auth
(
_self
);
auto
ct
=
current_time
();
//eosio_assert( ct - _gstateex.last_claim_time > useconds_per_day, "already claimed rewards within past day" );
_gstateex
.
last_claim_time
=
ct
;
const
auto
usecs_since_last_fill
=
ct
-
_gstate
.
last_pervote_bucket_fill
;
int
idx_year
=
(
int
)((
now
()
-
block_initial_timestamp
)
/
seconds_per_year
);
auto
seo_token
=
yta_seo_year
[
idx_year
]
*
YTA_SEO_BASE
;
if
(
usecs_since_last_fill
>
0
&&
_gstate
.
last_pervote_bucket_fill
>
0
)
{
auto
new_tokens
=
static_cast
<
int64_t
>
(
seo_token
*
YTA_PRECISION
*
double
(
usecs_since_last_fill
)
/
double
(
useconds_per_year
));
print
(
"new_token: "
,
new_tokens
,
"
\n
"
);
auto
to_per_base_pay
=
new_tokens
/
5
;
auto
to_producers
=
new_tokens
-
to_per_base_pay
;
auto
to_per_block_pay
=
to_producers
/
4
;
auto
to_per_vote_pay
=
to_producers
-
to_per_block_pay
;
INLINE_ACTION_SENDER
(
eosio
::
token
,
issue
)(
N
(
eosio
.
token
),
{{
N
(
eosio
),
N
(
active
)}},
{
N
(
eosio
),
asset
(
new_tokens
),
std
::
string
(
"issue tokens for producer pay"
)}
);
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
eosio
),
N
(
active
)},
{
N
(
eosio
),
N
(
hddbasefound
),
asset
(
to_per_base_pay
),
"fund per-base bucket"
}
);
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
eosio
),
N
(
active
)},
{
N
(
eosio
),
N
(
eosio
.
bpay
),
asset
(
to_per_block_pay
),
"fund per-block bucket"
}
);
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
eosio
),
N
(
active
)},
{
N
(
eosio
),
N
(
eosio
.
vpay
),
asset
(
to_per_vote_pay
),
"fund per-vote bucket"
}
);
_gstateex
.
perbase_bucket
+=
to_per_base_pay
;
_gstate
.
pervote_bucket
+=
to_per_vote_pay
;
_gstate
.
perblock_bucket
+=
to_per_block_pay
;
_gstate
.
last_pervote_bucket_fill
=
ct
;
}
int64_t
producer_total_base_pay
=
_gstateex
.
perbase_bucket
;
int64_t
producer_total_block_pay
=
_gstate
.
pervote_bucket
;
int64_t
producer_total_vote_pay
=
_gstate
.
perblock_bucket
;
int64_t
producer_already_base_pay
=
0
;
int64_t
producer_already_block_pay
=
0
;
int64_t
producer_already_vote_pay
=
0
;
for
(
auto
it
=
_producers
.
begin
();
it
!=
_producers
.
end
();
it
++
)
{
if
(
!
(
it
->
active
()))
continue
;
auto
prodex
=
_producersext
.
get
(
it
->
owner
);
int64_t
producer_per_base_pay
=
0
;
if
(
_gstateex
.
total_unpaid_base_cnt
>
0
)
{
producer_per_base_pay
=
(
_gstateex
.
perbase_bucket
*
prodex
.
unpaid_base_cnt
)
/
_gstateex
.
total_unpaid_base_cnt
;
}
int64_t
producer_per_block_pay
=
0
;
if
(
_gstate
.
total_unpaid_blocks
>
0
)
{
producer_per_block_pay
=
(
_gstate
.
perblock_bucket
*
it
->
unpaid_blocks
)
/
_gstate
.
total_unpaid_blocks
;
}
int64_t
producer_per_vote_pay
=
0
;
if
(
_gstate
.
total_producer_vote_weight
>
0
)
{
producer_per_vote_pay
=
int64_t
((
_gstate
.
pervote_bucket
*
it
->
total_votes
)
/
_gstate
.
total_producer_vote_weight
);
}
_producers
.
modify
(
it
,
0
,
[
&
](
auto
&
p
)
{
p
.
last_claim_time
=
ct
;
p
.
unpaid_blocks
=
0
;
});
_producersext
.
modify
(
prodex
,
0
,
[
&
](
auto
&
p
)
{
p
.
unpaid_base_cnt
=
0
;
});
_gstate
.
total_unpaid_blocks
-=
it
->
unpaid_blocks
;
_gstateex
.
total_unpaid_base_cnt
-=
prodex
.
unpaid_base_cnt
;
if
(
producer_per_base_pay
>
0
&&
((
producer_per_base_pay
+
producer_already_base_pay
)
<=
producer_total_base_pay
)
)
{
producer_already_base_pay
+=
producer_per_base_pay
;
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
hddbasefound
),
N
(
active
)},
{
N
(
hddbasefound
),
it
->
owner
,
asset
(
producer_per_base_pay
),
std
::
string
(
"producer base pay"
)
}
);
}
if
(
producer_per_block_pay
>
0
&&
((
producer_per_block_pay
+
producer_already_block_pay
)
<=
producer_total_block_pay
)
)
{
producer_already_block_pay
+=
producer_per_block_pay
;
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
eosio
.
bpay
),
N
(
active
)},
{
N
(
eosio
.
bpay
),
it
->
owner
,
asset
(
producer_per_block_pay
),
std
::
string
(
"producer block pay"
)
}
);
}
if
(
producer_per_vote_pay
>
0
&&
((
producer_per_vote_pay
+
producer_already_vote_pay
)
<=
producer_total_vote_pay
)
)
{
producer_already_vote_pay
+=
producer_per_vote_pay
;
INLINE_ACTION_SENDER
(
eosio
::
token
,
transfer
)(
N
(
eosio
.
token
),
{
N
(
eosio
.
vpay
),
N
(
active
)},
{
N
(
eosio
.
vpay
),
it
->
owner
,
asset
(
producer_per_vote_pay
),
std
::
string
(
"producer vote pay"
)
}
);
}
}
_gstateex
.
perbase_bucket
-=
producer_already_base_pay
;
_gstate
.
pervote_bucket
-=
producer_already_block_pay
;
_gstate
.
perblock_bucket
-=
producer_already_vote_pay
;
}
}
//namespace eosiosystem
contracts/eosio.system/voting.cpp
浏览文件 @
7e369333
...
...
@@ -114,7 +114,10 @@ namespace eosiosystem {
producers_seq_table
_prod_seq
(
_self
,
seq
);
if
(
_prod_seq
.
begin
()
!=
_prod_seq
.
end
()
)
_prod_seq
.
erase
(
_prod_seq
.
begin
());
}
}
_gstateex
.
total_unpaid_base_cnt
=
0
;
}
void
system_contract
::
seqproducer
(
const
account_name
producer
,
uint16_t
seq
,
uint8_t
level
)
{
...
...
@@ -132,7 +135,7 @@ namespace eosiosystem {
if
(
it
==
_producersext
.
end
())
{
_producersext
.
emplace
(
_self
,
[
&
](
auto
&
row
)
{
row
.
owner
=
producer
;
row
.
seq_num
=
seq
;
row
.
seq_num
=
seq
;
});
add_producer_seq
(
producer
,
seq
,
level
);
}
else
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录