mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 18:32:23 +00:00
Merge pull request #260 from dinhln89/genesis
Add MultisigWallet to puppeth for build new genesis.
This commit is contained in:
commit
8f4fc42df1
14 changed files with 2401 additions and 15 deletions
|
|
@ -35,6 +35,7 @@ import (
|
|||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||
blockSignerContract "github.com/ethereum/go-ethereum/contracts/blocksigner"
|
||||
multiSignWalletContract "github.com/ethereum/go-ethereum/contracts/multisigwallet"
|
||||
randomizeContract "github.com/ethereum/go-ethereum/contracts/randomize"
|
||||
validatorContract "github.com/ethereum/go-ethereum/contracts/validator"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
|
|
@ -171,7 +172,7 @@ func (w *wizard) makeGenesis() {
|
|||
|
||||
fmt.Println()
|
||||
fmt.Println("What is foundation wallet address? (default = 0x0000000000000000000000000000000000000068)")
|
||||
genesis.Config.Posv.FoudationWalletAddr = w.readDefaultAddress(common.HexToAddress("0x0000000000000000000000000000000000000068"))
|
||||
genesis.Config.Posv.FoudationWalletAddr = w.readDefaultAddress(common.HexToAddress(common.FoudationAddr))
|
||||
|
||||
// Validator Smart Contract Code
|
||||
pKey, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
|
||||
|
|
@ -205,6 +206,37 @@ func (w *wizard) makeGenesis() {
|
|||
Storage: storage,
|
||||
}
|
||||
|
||||
fmt.Println()
|
||||
fmt.Println("Which accounts are allowed to confirm in MultiSignWallet?")
|
||||
var owners []common.Address
|
||||
for {
|
||||
if address := w.readAddress(); address != nil {
|
||||
owners = append(owners, *address)
|
||||
continue
|
||||
}
|
||||
if len(owners) > 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
fmt.Println()
|
||||
fmt.Println("How many require for confirm tx in MultiSignWallet? (default = 2)")
|
||||
required := int64(w.readDefaultInt(2))
|
||||
|
||||
// MultiSigWallet.
|
||||
multiSignWalletAddr, _, err := multiSignWalletContract.DeployMultiSigWallet(transactOpts, contractBackend, owners, big.NewInt(required))
|
||||
if err != nil {
|
||||
fmt.Println("Can't deploy MultiSignWallet SMC")
|
||||
}
|
||||
contractBackend.Commit()
|
||||
code, _ = contractBackend.CodeAt(ctx, multiSignWalletAddr, nil)
|
||||
storage = make(map[common.Hash]common.Hash)
|
||||
contractBackend.ForEachStorageAt(ctx, multiSignWalletAddr, nil, f)
|
||||
genesis.Alloc[common.HexToAddress(common.FoudationAddr)] = core.GenesisAccount{
|
||||
Balance: big.NewInt(0),
|
||||
Code: code,
|
||||
Storage: storage,
|
||||
}
|
||||
|
||||
// Block Signers Smart Contract
|
||||
blockSignerAddress, _, err := blockSignerContract.DeployBlockSigner(transactOpts, contractBackend, big.NewInt(int64(epochNumber)))
|
||||
if err != nil {
|
||||
|
|
@ -237,6 +269,20 @@ func (w *wizard) makeGenesis() {
|
|||
Storage: storage,
|
||||
}
|
||||
|
||||
fmt.Println()
|
||||
fmt.Println("What is swap wallet address for fund 55m tomo?")
|
||||
swapAddr := w.readDefaultAddress(common.HexToAddress(common.FoudationAddr))
|
||||
baseBalance := big.NewInt(0) // 55m
|
||||
baseBalance.Add(baseBalance, big.NewInt(55*1000*1000))
|
||||
baseBalance.Mul(baseBalance, big.NewInt(1000000000000000000))
|
||||
subBalance := big.NewInt(0) // 150k
|
||||
subBalance.Add(subBalance, big.NewInt(150*1000))
|
||||
subBalance.Mul(subBalance, big.NewInt(1000000000000000000))
|
||||
baseBalance.Sub(baseBalance, subBalance) // 55m - 150k
|
||||
genesis.Alloc[swapAddr] = core.GenesisAccount{
|
||||
Balance: baseBalance,
|
||||
}
|
||||
|
||||
default:
|
||||
log.Crit("Invalid consensus engine choice", "choice", choice)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ const (
|
|||
BlockSigners = "0x0000000000000000000000000000000000000089"
|
||||
MasternodeVotingSMC = "0x0000000000000000000000000000000000000088"
|
||||
RandomizeSMC = "0x0000000000000000000000000000000000000090"
|
||||
FoudationAddr = "0x0000000000000000000000000000000000000068"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
|
|||
370
contracts/multisigwallet/contract/MultiSigWallet.sol
Normal file
370
contracts/multisigwallet/contract/MultiSigWallet.sol
Normal file
|
|
@ -0,0 +1,370 @@
|
|||
pragma solidity ^0.4.21;
|
||||
|
||||
|
||||
/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
|
||||
/// @author Stefan George - <stefan.george@consensys.net>
|
||||
contract MultiSigWallet {
|
||||
|
||||
/*
|
||||
* Events
|
||||
*/
|
||||
event Confirmation(address indexed sender, uint indexed transactionId);
|
||||
event Revocation(address indexed sender, uint indexed transactionId);
|
||||
event Submission(uint indexed transactionId);
|
||||
event Execution(uint indexed transactionId);
|
||||
event ExecutionFailure(uint indexed transactionId);
|
||||
event Deposit(address indexed sender, uint value);
|
||||
event OwnerAddition(address indexed owner);
|
||||
event OwnerRemoval(address indexed owner);
|
||||
event RequirementChange(uint required);
|
||||
|
||||
/*
|
||||
* Constants
|
||||
*/
|
||||
uint constant public MAX_OWNER_COUNT = 50;
|
||||
|
||||
/*
|
||||
* Storage
|
||||
*/
|
||||
mapping (uint => Transaction) public transactions;
|
||||
mapping (uint => mapping (address => bool)) public confirmations;
|
||||
mapping (address => bool) public isOwner;
|
||||
address[] public owners;
|
||||
uint public required;
|
||||
uint public transactionCount;
|
||||
|
||||
struct Transaction {
|
||||
address destination;
|
||||
uint value;
|
||||
bytes data;
|
||||
bool executed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Modifiers
|
||||
*/
|
||||
modifier onlyWallet() {
|
||||
require(msg.sender == address(this));
|
||||
_;
|
||||
}
|
||||
|
||||
modifier ownerDoesNotExist(address owner) {
|
||||
require(!isOwner[owner]);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier ownerExists(address owner) {
|
||||
require(isOwner[owner]);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier transactionExists(uint transactionId) {
|
||||
require(transactions[transactionId].destination != 0);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier confirmed(uint transactionId, address owner) {
|
||||
require(confirmations[transactionId][owner]);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier notConfirmed(uint transactionId, address owner) {
|
||||
require(!confirmations[transactionId][owner]);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier notExecuted(uint transactionId) {
|
||||
require(!transactions[transactionId].executed);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier notNull(address _address) {
|
||||
require(_address != 0);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier validRequirement(uint ownerCount, uint _required) {
|
||||
require(ownerCount <= MAX_OWNER_COUNT
|
||||
&& _required <= ownerCount
|
||||
&& _required != 0
|
||||
&& ownerCount != 0);
|
||||
_;
|
||||
}
|
||||
|
||||
/// @dev Fallback function allows to deposit ether.
|
||||
function()
|
||||
payable
|
||||
{
|
||||
if (msg.value > 0)
|
||||
Deposit(msg.sender, msg.value);
|
||||
}
|
||||
|
||||
/*
|
||||
* Public functions
|
||||
*/
|
||||
/// @dev Contract constructor sets initial owners and required number of confirmations.
|
||||
/// @param _owners List of initial owners.
|
||||
/// @param _required Number of required confirmations.
|
||||
function MultiSigWallet(address[] _owners, uint _required)
|
||||
public
|
||||
validRequirement(_owners.length, _required)
|
||||
{
|
||||
for (uint i=0; i<_owners.length; i++) {
|
||||
require(!isOwner[_owners[i]] && _owners[i] != 0);
|
||||
isOwner[_owners[i]] = true;
|
||||
}
|
||||
owners = _owners;
|
||||
required = _required;
|
||||
}
|
||||
|
||||
/// @dev Allows to add a new owner. Transaction has to be sent by wallet.
|
||||
/// @param owner Address of new owner.
|
||||
function addOwner(address owner)
|
||||
public
|
||||
onlyWallet
|
||||
ownerDoesNotExist(owner)
|
||||
notNull(owner)
|
||||
validRequirement(owners.length + 1, required)
|
||||
{
|
||||
isOwner[owner] = true;
|
||||
owners.push(owner);
|
||||
OwnerAddition(owner);
|
||||
}
|
||||
|
||||
/// @dev Allows to remove an owner. Transaction has to be sent by wallet.
|
||||
/// @param owner Address of owner.
|
||||
function removeOwner(address owner)
|
||||
public
|
||||
onlyWallet
|
||||
ownerExists(owner)
|
||||
{
|
||||
isOwner[owner] = false;
|
||||
for (uint i=0; i<owners.length - 1; i++)
|
||||
if (owners[i] == owner) {
|
||||
owners[i] = owners[owners.length - 1];
|
||||
break;
|
||||
}
|
||||
owners.length -= 1;
|
||||
if (required > owners.length)
|
||||
changeRequirement(owners.length);
|
||||
OwnerRemoval(owner);
|
||||
}
|
||||
|
||||
/// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
|
||||
/// @param owner Address of owner to be replaced.
|
||||
/// @param newOwner Address of new owner.
|
||||
function replaceOwner(address owner, address newOwner)
|
||||
public
|
||||
onlyWallet
|
||||
ownerExists(owner)
|
||||
ownerDoesNotExist(newOwner)
|
||||
{
|
||||
for (uint i=0; i<owners.length; i++)
|
||||
if (owners[i] == owner) {
|
||||
owners[i] = newOwner;
|
||||
break;
|
||||
}
|
||||
isOwner[owner] = false;
|
||||
isOwner[newOwner] = true;
|
||||
OwnerRemoval(owner);
|
||||
OwnerAddition(newOwner);
|
||||
}
|
||||
|
||||
/// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
|
||||
/// @param _required Number of required confirmations.
|
||||
function changeRequirement(uint _required)
|
||||
public
|
||||
onlyWallet
|
||||
validRequirement(owners.length, _required)
|
||||
{
|
||||
required = _required;
|
||||
RequirementChange(_required);
|
||||
}
|
||||
|
||||
/// @dev Allows an owner to submit and confirm a transaction.
|
||||
/// @param destination Transaction target address.
|
||||
/// @param value Transaction ether value.
|
||||
/// @param data Transaction data payload.
|
||||
/// @return Returns transaction ID.
|
||||
function submitTransaction(address destination, uint value, bytes data)
|
||||
public
|
||||
returns (uint transactionId)
|
||||
{
|
||||
transactionId = addTransaction(destination, value, data);
|
||||
confirmTransaction(transactionId);
|
||||
}
|
||||
|
||||
/// @dev Allows an owner to confirm a transaction.
|
||||
/// @param transactionId Transaction ID.
|
||||
function confirmTransaction(uint transactionId)
|
||||
public
|
||||
ownerExists(msg.sender)
|
||||
transactionExists(transactionId)
|
||||
notConfirmed(transactionId, msg.sender)
|
||||
{
|
||||
confirmations[transactionId][msg.sender] = true;
|
||||
Confirmation(msg.sender, transactionId);
|
||||
executeTransaction(transactionId);
|
||||
}
|
||||
|
||||
/// @dev Allows an owner to revoke a confirmation for a transaction.
|
||||
/// @param transactionId Transaction ID.
|
||||
function revokeConfirmation(uint transactionId)
|
||||
public
|
||||
ownerExists(msg.sender)
|
||||
confirmed(transactionId, msg.sender)
|
||||
notExecuted(transactionId)
|
||||
{
|
||||
confirmations[transactionId][msg.sender] = false;
|
||||
Revocation(msg.sender, transactionId);
|
||||
}
|
||||
|
||||
/// @dev Allows anyone to execute a confirmed transaction.
|
||||
/// @param transactionId Transaction ID.
|
||||
function executeTransaction(uint transactionId)
|
||||
public
|
||||
ownerExists(msg.sender)
|
||||
confirmed(transactionId, msg.sender)
|
||||
notExecuted(transactionId)
|
||||
{
|
||||
if (isConfirmed(transactionId)) {
|
||||
Transaction storage txn = transactions[transactionId];
|
||||
txn.executed = true;
|
||||
if (txn.destination.call.value(txn.value)(txn.data))
|
||||
Execution(transactionId);
|
||||
else {
|
||||
ExecutionFailure(transactionId);
|
||||
txn.executed = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// @dev Returns the confirmation status of a transaction.
|
||||
/// @param transactionId Transaction ID.
|
||||
/// @return Confirmation status.
|
||||
function isConfirmed(uint transactionId)
|
||||
public
|
||||
constant
|
||||
returns (bool)
|
||||
{
|
||||
uint count = 0;
|
||||
for (uint i=0; i<owners.length; i++) {
|
||||
if (confirmations[transactionId][owners[i]])
|
||||
count += 1;
|
||||
if (count == required)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Internal functions
|
||||
*/
|
||||
/// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
|
||||
/// @param destination Transaction target address.
|
||||
/// @param value Transaction ether value.
|
||||
/// @param data Transaction data payload.
|
||||
/// @return Returns transaction ID.
|
||||
function addTransaction(address destination, uint value, bytes data)
|
||||
internal
|
||||
notNull(destination)
|
||||
returns (uint transactionId)
|
||||
{
|
||||
transactionId = transactionCount;
|
||||
transactions[transactionId] = Transaction({
|
||||
destination: destination,
|
||||
value: value,
|
||||
data: data,
|
||||
executed: false
|
||||
});
|
||||
transactionCount += 1;
|
||||
Submission(transactionId);
|
||||
}
|
||||
|
||||
/*
|
||||
* Web3 call functions
|
||||
*/
|
||||
/// @dev Returns number of confirmations of a transaction.
|
||||
/// @param transactionId Transaction ID.
|
||||
/// @return Number of confirmations.
|
||||
function getConfirmationCount(uint transactionId)
|
||||
public
|
||||
constant
|
||||
returns (uint count)
|
||||
{
|
||||
for (uint i=0; i<owners.length; i++)
|
||||
if (confirmations[transactionId][owners[i]])
|
||||
count += 1;
|
||||
}
|
||||
|
||||
/// @dev Returns total number of transactions after filers are applied.
|
||||
/// @param pending Include pending transactions.
|
||||
/// @param executed Include executed transactions.
|
||||
/// @return Total number of transactions after filters are applied.
|
||||
function getTransactionCount(bool pending, bool executed)
|
||||
public
|
||||
constant
|
||||
returns (uint count)
|
||||
{
|
||||
for (uint i=0; i<transactionCount; i++)
|
||||
if ( pending && !transactions[i].executed
|
||||
|| executed && transactions[i].executed)
|
||||
count += 1;
|
||||
}
|
||||
|
||||
/// @dev Returns list of owners.
|
||||
/// @return List of owner addresses.
|
||||
function getOwners()
|
||||
public
|
||||
constant
|
||||
returns (address[])
|
||||
{
|
||||
return owners;
|
||||
}
|
||||
|
||||
/// @dev Returns array with owner addresses, which confirmed transaction.
|
||||
/// @param transactionId Transaction ID.
|
||||
/// @return Returns array of owner addresses.
|
||||
function getConfirmations(uint transactionId)
|
||||
public
|
||||
constant
|
||||
returns (address[] _confirmations)
|
||||
{
|
||||
address[] memory confirmationsTemp = new address[](owners.length);
|
||||
uint count = 0;
|
||||
uint i;
|
||||
for (i=0; i<owners.length; i++)
|
||||
if (confirmations[transactionId][owners[i]]) {
|
||||
confirmationsTemp[count] = owners[i];
|
||||
count += 1;
|
||||
}
|
||||
_confirmations = new address[](count);
|
||||
for (i=0; i<count; i++)
|
||||
_confirmations[i] = confirmationsTemp[i];
|
||||
}
|
||||
|
||||
/// @dev Returns list of transaction IDs in defined range.
|
||||
/// @param from Index start position of transaction array.
|
||||
/// @param to Index end position of transaction array.
|
||||
/// @param pending Include pending transactions.
|
||||
/// @param executed Include executed transactions.
|
||||
/// @return Returns array of transaction IDs.
|
||||
function getTransactionIds(uint from, uint to, bool pending, bool executed)
|
||||
public
|
||||
constant
|
||||
returns (uint[] _transactionIds)
|
||||
{
|
||||
uint[] memory transactionIdsTemp = new uint[](transactionCount);
|
||||
uint count = 0;
|
||||
uint i;
|
||||
for (i=0; i<transactionCount; i++)
|
||||
if ( pending && !transactions[i].executed
|
||||
|| executed && transactions[i].executed)
|
||||
{
|
||||
transactionIdsTemp[count] = i;
|
||||
count += 1;
|
||||
}
|
||||
_transactionIds = new uint[](to - from);
|
||||
for (i=from; i<to; i++)
|
||||
_transactionIds[i - from] = transactionIdsTemp[i];
|
||||
}
|
||||
}
|
||||
1898
contracts/multisigwallet/contract/multisigwallet.go
Normal file
1898
contracts/multisigwallet/contract/multisigwallet.go
Normal file
File diff suppressed because one or more lines are too long
57
contracts/multisigwallet/multisigwallet.go
Normal file
57
contracts/multisigwallet/multisigwallet.go
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
// Copyright (c) 2018 Tomochain
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package multisigwallet
|
||||
|
||||
import (
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/contracts/multisigwallet/contract"
|
||||
"math/big"
|
||||
)
|
||||
|
||||
type MultiSigWallet struct {
|
||||
*contract.MultiSigWalletSession
|
||||
contractBackend bind.ContractBackend
|
||||
}
|
||||
|
||||
func NewMultiSigWallet(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*MultiSigWallet, error) {
|
||||
blockSigner, err := contract.NewMultiSigWallet(contractAddr, contractBackend)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &MultiSigWallet{
|
||||
&contract.MultiSigWalletSession{
|
||||
Contract: blockSigner,
|
||||
TransactOpts: *transactOpts,
|
||||
},
|
||||
contractBackend,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func DeployMultiSigWallet(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend, _owners []common.Address, _required *big.Int) (common.Address, *MultiSigWallet, error) {
|
||||
blockSignerAddr, _, _, err := contract.DeployMultiSigWallet(transactOpts, contractBackend, _owners, _required)
|
||||
if err != nil {
|
||||
return blockSignerAddr, nil, err
|
||||
}
|
||||
|
||||
blockSigner, err := NewMultiSigWallet(transactOpts, blockSignerAddr, contractBackend)
|
||||
if err != nil {
|
||||
return blockSignerAddr, nil, err
|
||||
}
|
||||
|
||||
return blockSignerAddr, blockSigner, nil
|
||||
}
|
||||
|
|
@ -22,11 +22,11 @@ import (
|
|||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/consensus/posv"
|
||||
"github.com/ethereum/go-ethereum/contracts/blocksigner"
|
||||
"github.com/ethereum/go-ethereum/core"
|
||||
"github.com/ethereum/go-ethereum/core/types"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/ethereum/go-ethereum/consensus/posv"
|
||||
"math/big"
|
||||
"math/rand"
|
||||
"testing"
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ func TestRewardBalance(t *testing.T) {
|
|||
logCaps[i] = &logCap{accounts[randIndex].From.String(), randCap}
|
||||
}
|
||||
|
||||
foundationAddr := common.HexToAddress("0x0000000000000000000000000000000000000068")
|
||||
foundationAddr := common.HexToAddress(common.FoudationAddr)
|
||||
totalReward := new(big.Int).SetInt64(15 * 1000)
|
||||
rewards, err := contracts.GetRewardBalancesRate(foundationAddr, acc3Addr, totalReward, baseValidator)
|
||||
if err != nil {
|
||||
|
|
|
|||
|
|
@ -366,7 +366,7 @@ func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis {
|
|||
common.BytesToAddress([]byte{6}): {Balance: big.NewInt(1)}, // ECAdd
|
||||
common.BytesToAddress([]byte{7}): {Balance: big.NewInt(1)}, // ECScalarMul
|
||||
common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing
|
||||
faucet: {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))},
|
||||
faucet: {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,8 +40,8 @@ type PublicDownloaderAPI struct {
|
|||
// installSyncSubscription channel.
|
||||
func NewPublicDownloaderAPI(d *Downloader, m *event.TypeMux) *PublicDownloaderAPI {
|
||||
api := &PublicDownloaderAPI{
|
||||
d: d,
|
||||
mux: m,
|
||||
d: d,
|
||||
mux: m,
|
||||
installSyncSubscription: make(chan chan interface{}),
|
||||
uninstallSyncSubscription: make(chan *uninstallSyncSubscriptionRequest),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -669,7 +669,7 @@ func (f *Fetcher) insert(peer string, block *types.Block) {
|
|||
go f.broadcastBlock(block, true)
|
||||
return
|
||||
}
|
||||
f.enqueue(peer,newBlock)
|
||||
f.enqueue(peer, newBlock)
|
||||
return
|
||||
default:
|
||||
// Something went very wrong, drop the peer
|
||||
|
|
|
|||
|
|
@ -242,10 +242,10 @@ func testGetBlockBodies(t *testing.T, protocol int) {
|
|||
available []bool // Availability of explicitly requested blocks
|
||||
expected int // Total number of existing blocks to expect
|
||||
}{
|
||||
{1, nil, nil, 1}, // A single random block should be retrievable
|
||||
{10, nil, nil, 10}, // Multiple random blocks should be retrievable
|
||||
{limit, nil, nil, limit}, // The maximum possible blocks should be retrievable
|
||||
{limit + 1, nil, nil, limit}, // No more than the possible block count should be returned
|
||||
{1, nil, nil, 1}, // A single random block should be retrievable
|
||||
{10, nil, nil, 10}, // Multiple random blocks should be retrievable
|
||||
{limit, nil, nil, limit}, // The maximum possible blocks should be retrievable
|
||||
{limit + 1, nil, nil, limit}, // No more than the possible block count should be returned
|
||||
{0, []common.Hash{pm.blockchain.Genesis().Hash()}, []bool{true}, 1}, // The genesis block should be retrievable
|
||||
{0, []common.Hash{pm.blockchain.CurrentBlock().Hash()}, []bool{true}, 1}, // The chains head block should be retrievable
|
||||
{0, []common.Hash{{}}, []bool{false}, 0}, // A non existent block should not be returned
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -40,9 +40,9 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
alpha = 3 // Kademlia concurrency factor
|
||||
alpha = 3 // Kademlia concurrency factor
|
||||
bucketSize = 200 // Kademlia bucket size
|
||||
maxReplacements = 10 // Size of per-bucket replacement list
|
||||
maxReplacements = 10 // Size of per-bucket replacement list
|
||||
|
||||
// We keep buckets for the upper 1/15 of distances because
|
||||
// it's very unlikely we'll ever encounter a node that's closer.
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ func initErrHandling() {
|
|||
multipleChoicesPage := GetMultipleChoicesErrorPage()
|
||||
//map the codes to the available pages
|
||||
tnames := map[int]string{
|
||||
0: genErrPage, //default
|
||||
0: genErrPage, //default
|
||||
http.StatusBadRequest: genErrPage,
|
||||
http.StatusNotFound: notFoundPage,
|
||||
http.StatusMultipleChoices: multipleChoicesPage,
|
||||
|
|
|
|||
Loading…
Reference in a new issue