This commit is contained in:
Kirill Fedoseev 2019-11-04 12:53:58 +03:00
parent 25941a61e7
commit 8c8dad07ca
7 changed files with 19 additions and 15 deletions

14
DEMO.md
View File

@ -197,11 +197,11 @@ The public Binance Chain testnet will keep a BEP2 token.
"nextEpoch": 3, "nextEpoch": 3,
// threshold number for current epoch, // threshold number for current epoch,
// threshold + 1 votes are required for any changes in next epoch // at least threshold votes are required for any changes in next epoch
"threshold": 1, "threshold": 2,
// threshold number for next epoch // threshold number for next epoch
"nextThreshold": 1, "nextThreshold": 2,
// current bridge addresses in home and foreign networks // current bridge addresses in home and foreign networks
"homeBridgeAddress": "0x44c158FE850821ae69DaF37AADF5c539e9d0025B", "homeBridgeAddress": "0x44c158FE850821ae69DaF37AADF5c539e9d0025B",
@ -239,13 +239,13 @@ The public Binance Chain testnet will keep a BEP2 token.
"confirmationsForFundsTransfer": 0 "confirmationsForFundsTransfer": 0
} }
``` ```
* (7.1) Start voting process for next epoch, via sending `$THRESHOLD + 1` requests to `/vote/startVoting` url. Bridge * (7.1) Start voting process for next epoch, via sending `$THRESHOLD` requests to `/vote/startVoting` url. Bridge
state should be successfully changed to `voting`. state should be successfully changed to `voting`.
* 7.2 Changing next epoch bridge validators / threshold * 7.2 Changing next epoch bridge validators / threshold
* (7.2.1) Add / remove validator in next validators list, via sending `$THRESHOLD + 1` requests to * (7.2.1) Add / remove validator in next validators list, via sending `$THRESHOLD` requests to
`/vote/addValidator/$ADDRESS` / `/vote/removeValidator/$ADDRESS`. `/vote/addValidator/$ADDRESS` / `/vote/removeValidator/$ADDRESS`.
* (7.2.2) Change threshold for the next epoch, via sending `$THRESHOLD + 1` requests to `/vote/changeThreshold/$THRESHOLD`. * (7.2.2) Change threshold for the next epoch, via sending `$THRESHOLD` requests to `/vote/changeThreshold/$THRESHOLD`.
* (7.3) Start keygen process for next epoch, via sending `$THRESHOLD + 1` requests to `/vote/startKeygen` url. Bridge * (7.3) Start keygen process for next epoch, via sending `$THRESHOLD` requests to `/vote/startKeygen` url. Bridge
state should be successfully changed to `keygen`, and in some time to `funds_transfer`, and then to `ready`. state should be successfully changed to `keygen`, and in some time to `funds_transfer`, and then to `ready`.
* (7.4) If keygen process at some state was stopped(i. e. one validator turned of his oracle), * (7.4) If keygen process at some state was stopped(i. e. one validator turned of his oracle),
it can be cancelled via via sending `$THRESHOLD + 1` requests to `/vote/cancelKeygen` url. After it can be cancelled via via sending `$THRESHOLD + 1` requests to `/vote/cancelKeygen` url. After

View File

@ -9,7 +9,7 @@ VALIDATOR_ADDRESS_2=0xaa006899b0ec407de930ba8a166defe59bbfd3dc
VALIDATOR_ADDRESS_3=0x6352e3e6038e05b9da00c84ae851308f9774f883 VALIDATOR_ADDRESS_3=0x6352e3e6038e05b9da00c84ae851308f9774f883
#VALIDATOR_ADDRESS_4=0x4db6b4bd0a3fdc03b027a60f1c48f05c572312aa #VALIDATOR_ADDRESS_4=0x4db6b4bd0a3fdc03b027a60f1c48f05c572312aa
THRESHOLD=1 THRESHOLD=2
MIN_TX_LIMIT=10000000000000000 MIN_TX_LIMIT=10000000000000000
MAX_TX_LIMIT=100000000000000000000 MAX_TX_LIMIT=100000000000000000000

View File

@ -10,7 +10,7 @@ VALIDATOR_ADDRESS_2=0xbbbb63D6Fc58bD14dAF9eeF653650c4D10f3dBC8
VALIDATOR_ADDRESS_3=0xcccc27ae510b63E30eC3C68AAD7DdD2578bD62ed VALIDATOR_ADDRESS_3=0xcccc27ae510b63E30eC3C68AAD7DdD2578bD62ed
#VALIDATOR_ADDRESS_4=0xdddd9300e32fe162bA420f7313651Fd901C2ed71 #VALIDATOR_ADDRESS_4=0xdddd9300e32fe162bA420f7313651Fd901C2ed71
THRESHOLD=1 THRESHOLD=2
MIN_TX_LIMIT=10000000000000000 MIN_TX_LIMIT=10000000000000000
MAX_TX_LIMIT=100000000000000000000 MAX_TX_LIMIT=100000000000000000000

View File

@ -57,7 +57,7 @@ contract Bridge {
constructor(uint threshold, address[] memory validators, address _tokenContract, uint[2] memory limits, uint rangeSize) public { constructor(uint threshold, address[] memory validators, address _tokenContract, uint[2] memory limits, uint rangeSize) public {
require(validators.length > 0); require(validators.length > 0);
require(threshold < validators.length); require(threshold <= validators.length);
tokenContract = IERC20(_tokenContract); tokenContract = IERC20(_tokenContract);
@ -280,6 +280,8 @@ contract Bridge {
} }
function voteChangeThreshold(uint threshold) public voting currentValidator { function voteChangeThreshold(uint threshold) public voting currentValidator {
require(threshold > 0 && threshold <= getParties(), "Invalid threshold value");
if (tryVote(Vote.CHANGE_THRESHOLD, threshold)) { if (tryVote(Vote.CHANGE_THRESHOLD, threshold)) {
states[nextEpoch].threshold = threshold; states[nextEpoch].threshold = threshold;
} }
@ -292,6 +294,8 @@ contract Bridge {
} }
function voteStartKeygen() public voting currentValidator { function voteStartKeygen() public voting currentValidator {
require(getNextThreshold() <= getNextParties(), "Invalid threshold number");
if (tryVote(Vote.START_KEYGEN)) { if (tryVote(Vote.START_KEYGEN)) {
status = Status.KEYGEN; status = Status.KEYGEN;
@ -342,7 +346,7 @@ contract Bridge {
require(!votes[personalVote], "Voted already"); require(!votes[personalVote], "Voted already");
votes[personalVote] = true; votes[personalVote] = true;
if (votesCount[vote] == getThreshold()) { if (votesCount[vote] + 1 == getThreshold()) {
votesCount[vote] = 2 ** 255; votesCount[vote] = 2 ** 255;
return true; return true;
} else { } else {
@ -356,7 +360,7 @@ contract Bridge {
require(!votes[personalVote], "Confirmed already"); require(!votes[personalVote], "Confirmed already");
votes[personalVote] = true; votes[personalVote] = true;
if (votesCount[vote] == getNextThreshold()) { if (votesCount[vote] + 1 == getNextThreshold()) {
votesCount[vote] = 2 ** 255; votesCount[vote] = 2 ** 255;
return true; return true;
} else { } else {

View File

@ -42,7 +42,7 @@ async function main() {
logger.debug('Writing params') logger.debug('Writing params')
fs.writeFileSync('./params', JSON.stringify({ fs.writeFileSync('./params', JSON.stringify({
parties: parties.toString(), parties: parties.toString(),
threshold: threshold.toString() threshold: (threshold - 1).toString()
})) }))
const cmd = exec.execFile('./keygen-entrypoint.sh', [PROXY_URL, keysFile], async () => { const cmd = exec.execFile('./keygen-entrypoint.sh', [PROXY_URL, keysFile], async () => {
currentKeygenEpoch = null currentKeygenEpoch = null

View File

@ -172,7 +172,7 @@ async function main() {
logger.debug('Writing params') logger.debug('Writing params')
fs.writeFileSync('./params', JSON.stringify({ fs.writeFileSync('./params', JSON.stringify({
parties: parties.toString(), parties: parties.toString(),
threshold: threshold.toString() threshold: (threshold - 1).toString()
})) }))
attempt = 1 attempt = 1

View File

@ -81,7 +81,7 @@ describe('bridge tests', function () {
testEthToBnc(() => users) testEthToBnc(() => users)
testBncToEth(() => users) testBncToEth(() => users)
testChangeThreshold(2) testChangeThreshold(3)
testEthToBnc(() => users) testEthToBnc(() => users)
testBncToEth(() => users) testBncToEth(() => users)