mirror of
https://github.com/bigchaindb/bigchaindb.git
synced 2024-10-13 13:34:05 +00:00

* Problem: We need a way to synchronize a halt to block production to allow for upgrades across breaking changes. * Solution: Created `MigrationElection`. * Problem: Need documentation for `migration` elections. * Solution: Updated the docs. * Problem: `MigrationElection` needs 'new' CLI method. * Solution: Updated the definition of `election` to include the new `migration` type. * Problem: The way `end_block` checks for concluded elections assumes there is only one type of election (so we can't conclude an `upsert-validator` and a `chain-migration` at the same height). * Solution: Re-engineered the code in `Elections` to conclude multiple elections in the same block. If more than one election change the validator set, only one of them is applied. * Problem: Tendermint change to store validator changes at height h+2 will break `Election.get_status`. * Solution: Reworked `get_validator_change` to look at only the latest block height or less.
55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
# Copyright BigchainDB GmbH and BigchainDB contributors
|
|
# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0)
|
|
# Code is Apache-2.0 and docs are CC-BY-4.0
|
|
|
|
from functools import singledispatch
|
|
|
|
from bigchaindb import Vote
|
|
from bigchaindb.backend.localmongodb.connection import LocalMongoDBConnection
|
|
from bigchaindb.backend.schema import TABLES
|
|
from bigchaindb.elections.election import Election
|
|
|
|
|
|
@singledispatch
|
|
def flush_db(connection, dbname):
|
|
raise NotImplementedError
|
|
|
|
|
|
@flush_db.register(LocalMongoDBConnection)
|
|
def flush_localmongo_db(connection, dbname):
|
|
for t in TABLES:
|
|
getattr(connection.conn[dbname], t).delete_many({})
|
|
|
|
|
|
def generate_block(bigchain):
|
|
from bigchaindb.common.crypto import generate_key_pair
|
|
from bigchaindb.models import Transaction
|
|
import time
|
|
|
|
alice = generate_key_pair()
|
|
tx = Transaction.create([alice.public_key],
|
|
[([alice.public_key], 1)],
|
|
asset=None)\
|
|
.sign([alice.private_key])
|
|
|
|
code, message = bigchain.write_transaction(tx, 'broadcast_tx_commit')
|
|
assert code == 202
|
|
time.sleep(2)
|
|
|
|
|
|
def to_inputs(election, i, ed25519_node_keys):
|
|
input0 = election.to_inputs()[i]
|
|
votes = election.outputs[i].amount
|
|
public_key0 = input0.owners_before[0]
|
|
key0 = ed25519_node_keys[public_key0]
|
|
return (input0, votes, key0)
|
|
|
|
|
|
def gen_vote(election, i, ed25519_node_keys):
|
|
(input_i, votes_i, key_i) = to_inputs(election, i, ed25519_node_keys)
|
|
election_pub_key = Election.to_public_key(election.id)
|
|
return Vote.generate([input_i],
|
|
[([election_pub_key], votes_i)],
|
|
election_id=election.id)\
|
|
.sign([key_i.private_key])
|