Commit Graph

123 Commits

Author SHA1 Message Date
Alexander Kolotov 7c429798b3
Merge pull request #82 from yrashk/required-signatures
Problem: required_signatures is static
2018-07-05 12:34:20 +03:00
Yurii Rashkovskii 18802df14c
Problem: insecure RPCs are subject to MITM attacks
Solution: by default, disallow use of non-TLS RPC endpoints

For testing, there's an escape hatch of a command line
argument `--allow-insecure-rpc-endpoints` (purposefully
long) that will reduce the severity of using a non-TLS
RPC endpoint to a warning in a log file.

It was not made to be a configuration file option to reduce
the risk of this option slipping into a production configuration
file by mistake.

Closes #79
2018-06-04 14:33:32 -07:00
Yurii Rashkovskii d4de1c824f
Problem: can't merge "required_signatures is static"
This is because other changes on master are in conflict.

Solution: merge and resolve conflicts

Merge remote-tracking branch 'origin/master' into required-signatures
2018-06-04 14:27:13 -07:00
Yurii Rashkovskii b890ada627
Problem: config allows arbitrary keys to be passed
This means that a misspelled config field can cause a lot
of confusion -- things won't work as expected.

Solution: restore more restrictive config deserialization
where unknown keys would trigger an error
2018-06-04 14:17:29 -07:00
Yurii Rashkovskii bbda17d906
Merge pull request #94 from yrashk/accounts-deprecation
Problem: authorities.accounts config setting is obsolete
2018-06-04 14:15:29 -07:00
Yurii Rashkovskii 9b131a2385
Merge pull request #95 from yrashk/mod-refactor
Problem: potential loss of database updates
2018-06-04 14:14:45 -07:00
Yurii Rashkovskii ae8cc1552f
Problem: slow performance and regular timeouts sending transactions
Solution: fix the maximum number of concurrent HTTP request
at a transport level.

It is set by default to 64 and there's now a new configuration
parameter (`concurrent_http_requests`) in `home` and `foreign`
sections. Previously used `concurrency` parameter from transactions
configuration has been removed.
2018-06-01 18:31:47 -07:00
Yurii Rashkovskii b7d7dd3a97
Bump version to 0.3.0 2018-05-31 13:45:34 -07:00
Yurii Rashkovskii 3ea15931fb
Prepare 0.2.1 2018-05-31 11:06:12 -07:00
Alexander Kolotov 6cb2c5689a
Merge pull request #93 from yrashk/gas-price-errors
Problem: bridge panics if there's an error retrieving gas price
2018-05-30 17:05:14 +03:00
Yurii Rashkovskii b68f23558b
Problem: authorities.accounts config setting is obsolete
Solution: make it only accessible when `deploy` feature is on
(for integration tests)

Closes #73
2018-05-28 11:15:51 -07:00
Yurii Rashkovskii 4404af9a5f
Problem: GasPriceStream using web3 timeout
However, this is different infrastructure and
might have different requirements.

Solution: use gas_price_timeout
2018-05-28 10:06:38 -07:00
Yurii Rashkovskii 8082daa392
Problem: gas price retrieving is not tested well
Solution: extract price retrieving from GasPriceStream
and test it.
2018-05-28 10:04:15 -07:00
Yurii Rashkovskii af81eb0d57
Problem: potential loss of database updates
chance of loss of database updates that would cause it to redo
transactions it already did.

Let's say we've got some database updates through deposit relaying:
https://github.com/poanetwork/poa-bridge/blob/master/bridge/src/bridge/mod.rs#L164-L165

Then, during relaying withdrawals, an error happened:
https://github.com/poanetwork/poa-bridge/blob/master/bridge/src/bridge/mod.rs#L171-L172

This means that we won't reach
https://github.com/poanetwork/poa-bridge/blob/master/bridge/src/bridge/mod.rs#L185-L193
to save the result.

Also, in a similar vein, if one of these streams was to end
(`Ready(None)`) we'd experience a similar loss of updates:
https://github.com/poanetwork/poa-bridge/blob/master/bridge/src/macros.rs#L5

Solution: refactor bridge into two streams, splitting responsibilities

One stream (`BridgeEventStream`) returns `BridgeChecked` and the other
(`Bridge`) writes those checks down to the database.

This way we're not accumulating chcecks before we serialize them,
risking not serializing them at all in the event of an unrelated error.

Fixes #84
2018-05-25 17:31:11 -07:00
Yurii Rashkovskii dc5bba0c3c
Problem: bridge panics if there's an error retrieving gas price
Solution: instead, log an error and use previous price
2018-05-25 01:42:29 -07:00
Peter van Nostrand d480d57a84 Problem: not enforcing a minimum required rustc version could lead to build-time errors
Solution: add a mechanism to enforce a minimum required rustc version
in the bridge's build script
2018-05-24 20:13:05 -04:00
Yurii Rashkovskii fac38d7059
Problem: can't be merged with the master without a conflict
Solution: resolve the conflict

(Merge remote-tracking branch 'origin/master' into required-signatures)
2018-05-23 22:20:19 -07:00
Peter van Nostrand aaa5bee49e Problem: no functionality exists to dynamically fetch gas-prices
Currently, gas-prices are set upon bridge startup via the
Users's config TOML file; this value remains constant for the
life of the Bridge.

Solution: create a mechanism that asynchronously queries
gas-prices from an "Oracle" service on a timed interval. This
mechanism should be a stream of gas-prices that can be polled
from the Bridge.
2018-05-23 20:42:13 -04:00
Yurii Rashkovskii 379973f315
Problem: tracking RequiredSignaturesChanged is complicated
This requires retreiving validators contract, calling
`requiredSignatures()` and carefully tracking
`RequiredSignaturesChanged` events.

Solution: use recently introduced additional parameter in
CollectedSignatures to obtain the number of required signatures.
2018-05-23 01:02:12 -07:00
Yurii Rashkovskii 8a56c5cafb
Problem: required_signatures is static
Validators' information is completely configured through validators
contracts and does not depend on `authorities.required_signatures`
parameter of bridge's configuration.

The number of validators also could be changed during run-time and
therefore `authorities.required_signatures` parameter will not reflect
the actual number of signatures required for transaction validation.

Solution: retrieve required_signatures from RequiredSignaturesChanged
event and requiredSignatures() method

Closes #74
2018-05-19 08:38:53 -07:00
Yurii Rashkovskii d25bea1a93
Problem: integration tests get stuck (most of the time)
Solution: ensure not failing the initial checking of the balance
if it was in fact successful.
2018-05-11 11:02:44 -07:00
Yurii Rashkovskii c513d010c7
Prepare 0.2.0 2018-05-08 11:03:33 -07:00
Yurii Rashkovskii 40b21ddb7d
Problem: errors do not show their context
If the error like this appears in the logs:
```
INFO:bridge::bridge::withdraw_confirm: waiting for new withdraws that
should get signed
WARN:bridge: Bridge crashed with Error(Transport("Incomplete"), State {
next_error: None, backtrace: None })
Error(Transport("Incomplete"), State { next_error: None, backtrace: None
})
```
it is hard to understand which side of the bridge failed. The message
must contains type of operation (`deposit_relay`, `withdraw_confirm` or
`withdraw_relay`) and side of bridge (URL of RPC channel).

Solution: record error's top level context and print it out if recorded

Addresses #75
2018-05-08 00:48:35 -07:00
Yurii Rashkovskii c3c2461af3
Problem: eth_getLogs returning no logs in some cases
Sometimes there's an event and eth_getLogs returns
nothing.

Solution: trim the nulls from the topic filter's tail

It appears that in some implementations or setups
eth_getLogs topics: [A, null, null, null] won't return
logs when only [A] was there.

This patch is a quick workaround that trims nulls from
that said tail. A proper fix would likely require
an incursion into ethabi to make Topic optional.
2018-05-04 13:58:19 -07:00
Yurii Rashkovskii ce487b34a6
Problem: bridge tests failing
Solution: bring them up to date
2018-05-04 11:02:17 -07:00
Yurii Rashkovskii f98fc49aed
Problem: bridge tests don't compile
Solution: the database format changed, accommodate that
2018-05-04 10:55:30 -07:00
Yurii Rashkovskii 4feca245f1
Problem: home_deploy and foreign_deploy fields
These fields in database are no longer useful outside of
integration testing.

Solution: make them optional

Closes #67
2018-05-04 10:08:12 -07:00
Yurii Rashkovskii fbe77d7359
Problem: bridge sends out transactions slowly
This is because it is limiting them to one at a time
per operation type. This was done so that there's no
gaps in nonces due to undelivered transactions.

Solution: allow concurrent sending of transactions

By default, 100 transactions are allowed.

Note, however, that now there's a chance that nonce
gaps may be formed under cerain circumstances.
2018-05-03 14:14:42 -07:00
Yurii Rashkovskii 6a371cfb46
Merge pull request #58 from yrashk/contract-setting
Problem: `contract` configuration is no longer necessary
2018-05-01 19:10:29 -07:00
Yurii Rashkovskii 6ed056b744
Problem: estimated_gas_cost_of_withdraw setting is no longer useful
Solution: remove it from the default build
2018-05-01 11:58:08 -07:00
Yurii Rashkovskii 633e4a122a
Problem: `contract` configuration is no longer necessary
It is only necessary when deploying

Solution: remove the requirement for this configuration option
but leave it for the `deploy` feature used in integration tests
until they are rewritten to use external deployment mechanics.
2018-05-01 11:40:30 -07:00
Alexander Kolotov f6c6546e77
Merge pull request #56 from yrashk/failing-tests
Problem: bridge crate tests failing to compile
2018-05-01 20:43:15 +03:00
Yurii Rashkovskii 935f6bdc9b
Problem: bridge crate tests failing to compile
Solution: bring them up to date
2018-05-01 10:03:42 -07:00
Yurii Rashkovskii 9a192c1e07
Problem: bridge should not deploy its contracts anymore
Bridge's contracts are now developed in a separate repository
and have their own deployment procedure:

https://github.com/poanetwork/poa-parity-bridge-contracts

However, our integration tests are not yet updated to
use this deployment procedure.

Solution: disable deployment compile-time by default
and only use it in integration tests as a stopgap measure
until the new deployment procedure (or any other viable
alternative) has been used.
2018-05-01 09:43:34 -07:00
Yurii Rashkovskii 385c5885dd
Problem: nonce reuse without error
In cases when the node is backed by a cluster of nodes,
one node will not share the same information with the
other, hence it will not be able to report nonce reuse,
ultimately leading to lost transactions as they are
discarded later.

Solution: combine getTransactionCount with an internal counter
so that validator controls its own nonces, but in case if
something external happens, it can reset itself against
those externalities.
2018-04-29 16:41:03 -07:00
Yurii Rashkovskii a1269272e2
Problem: nonce reuse
Unfortunately, bridge will still reuse nonce very often.
Specifically when trying to send more than one transaction at
a time, clearly a faulty behaviour.

Solution: chain retrieving a nonce with subsequent sending
of the transaction.

However, chaining these is not enough as it'll still fail.

This is happening because bridge module is polling all its components
(deposit_relay, withdraw_confirm, withdraw_relay) sequentially,
 and some of them maybe waiting on their transactions to go through.

However, those transactions are also done as composed futures of nonce
retrieval and transaction sending. This means that it is very often
that first, these futures will go through the nonce acquisition process,
get the same values, and then submit transactions with the same nonce.

This patch makes NonceCheck future check if the transaction failed
with this specific issue of nonce reuse and effectively restarts from
the beginning in that case, repeating nonce acquisition process... until
it succeeeds.
2018-04-29 13:20:42 -07:00
Yurii Rashkovskii 072291813c
Problem: withdraw_confirm failure
If a node configured as Foreign for the bridge and it has no validator
account unlocked the bridge crashes and produces the following message:

```
INFO:bridge::bridge::withdraw_confirm: got 1 new withdraws to sign
INFO:bridge::bridge::withdraw_confirm: withdraw is ready for signature
submission. tx hash 0x6493…4fa8
INFO:bridge::bridge::withdraw_confirm: signing
WARN:bridge: Bridge crashed with Error(Transport("Unexpected response
status code: 405 Method Not Allowed"), State { next_error: None,
backtrace: None })
Error(Transport("Unexpected response status code: 405 Method Not
Allowed"), State { next_error: None, backtrace: None })
```

Solution: sign messages locally

Closes #49
2018-04-28 15:50:25 -07:00
Yurii Rashkovskii c0715dadba
Merge branch 'raw-transactions' into rpc+raw-transactions 2018-04-26 18:21:07 -07:00
Yurii Rashkovskii 58d092f1d4
Merge branch 'rpc' into rpc+raw-transactions-1 2018-04-26 18:13:24 -07:00
Yurii Rashkovskii fe28e335e0
Problem: RPC transport doesn't support HTTPS
Solution: upgrade web3 to the version which has support for TLS
2018-04-26 18:12:01 -07:00
Yurii Rashkovskii e5afb28783
Problem: AsRef implementation of App
It isn't really necessary for anything that I can see.

Solution: remove it
2018-04-26 17:57:29 -07:00
Yurii Rashkovskii 96ecfab2c6
Problem: unlocking account every time to sign a tx
On my computer, this takes approximately 0.3 seconds, which is clearly
a deal-breaker. In retrospect, this is an obvious problem because
of key derivation function use.

Solution: unlock accounts permanently.

This cut down time to sign one transaction is 0.0001 or so.
2018-04-26 17:53:38 -07:00
Yurii Rashkovskii 94b1343594
Problem: sending unsigned transactions over API
This means that the node has to sign the transaction itself.
It might be acceptable in a localized setup, but can't be used
with untrusted setups. For example, once HTTP RPC is supported,
we can't really use infrastructure like INFURA to send transactions.

Solution: switch to signing transactions in bridge

This absolutely requires separating the accounts used by validators
and administrative tasks as this will otherwise interfere with
management of nonces.
2018-04-26 17:50:07 -07:00
Yurii Rashkovskii 4151237c54
Problem: RPC transport change conflated with keystore
As a part of the original feature request, there was a need
for the bridge to be able to sign its own transactions. However,
this didn't fully materialize in the original patch, and only
configuration parameters were implemented.

Solution: remove these last conflated bits
and make this a pure transport change patch.
2018-04-19 10:13:45 -07:00
Yurii Rashkovskii 449c97cf5b
Problem: unnecessarily complicated string formatting
Solution: use format!() macro instead of manual concatenation
2018-04-19 09:51:38 -07:00
Yurii Rashkovskii 39202644b8
Problem: some unnecessary leftovers in the RPC patch
Solution: remove them
2018-04-19 09:51:38 -07:00
Yurii Rashkovskii c04d6a282e
Problem: RPC patch doesn't compile yet
The inner workings of choosing IPC vs RPC haven't been worked out.

Solution: remove IPC in favour of RPC
2018-04-19 09:51:37 -07:00
Edward Mack aacea235bb
Problem: IPC doesn't scale well
Using IPC means bridge has to run alognside the node
on the same machine. This, at times, presents problems
in terms of efficiency or coupling of deployment.

Solution: switch to RPC
2018-04-19 09:51:32 -07:00
Yurii Rashkovskii 976256780b
Problem: unknown balance warning
Upon startup, bridge produces the following warning:

```
WARN:bridge::bridge::deposit_relay: foreign contract balance is unknown
```

This happens because the RPC response from the node might
not come/get processed immediately.

By itself this warning means that the deposit_relay won't
perform any operations.

Solution: don't commence operations until balances are retrieved

Also, indicate when balances are retrieved:

```
INFO:bridge::bridge: Retrieved home contract balance
INFO:bridge::bridge: Retrieved foreign contract balance
```

This shows us that the balances are successfully retrieved and
bridge can commence its operations.
2018-04-16 07:21:31 -07:00
Yurii Rashkovskii 618d3bcb00
Problem: bridge crashes with insufficient balance
Currently there are two possible situations related to low balance on
the account which is used for bridge operations:

1. The account which is used to sign transactions to be addressed by
ForeignBridge contract has low balance. So, the bridge is not able to do
deposit_relay and withdraw_confirm.
2. The account which is used to sign transactions to be addressed by
HomeBridge contract has low balance. So, the bridge is not able to do
withdraw_relay.

In both cases bridges hangs silently at the moment of sending
transactions and does not proceed with further actions even the
operation is intended to be performed in opposite direction (e.g. the
bridge hangs at the moment to perform withdraw_relay, so deposit_relay
cannot be performed either).

Solution: make bridge track its balance and hande insufficient

Bridge will crash with ERR_INSUFFICIENT_FUNDS (code 4) so that
supervisor can decide what should happen next. It will also log the
condition.

P.S.Make sure to run the tests with `--test-threads=1` to avoid
other test conflicting with this one. A better solution to this
issue must be devised later, however.
2018-04-04 10:42:16 +04:00