POA-Ethereum Bridge
This is software to be operated by POA bridge validators to faciliate proof-of-authority based briding of POA to tokens on an another Ethereum-based blockchain.
The validators work with POA bridge contracts to convert ether on one chain into the same amount of ERC20 tokens on the other and back.
This software works in conjunction with other projects:
- POA Bridge UI
- POA Bridge Smart Contracts
- POA Bridge Monitoring service
- POA Bridge Deployment scripts
Functionality
The bridge connects two chains (home
and foreign
). When a user deposits ether into the
bridge contract contract on home
they get the same amount of ERC20 tokens on foreign
,
and they can convert them back as well.
Deposit
Withdraw
How to build
Requires rust
and cargo
: installation instructions.
Requires solc
to be in $PATH
: installation instructions.
Assuming you've cloned the bridge (git clone git@github.com:poanetwork/poa-bridge.git
), run
cd poa-bridge
make
and install ../target/release/bridge
in your $PATH
.
Running
bridge --config config.toml --database db.toml
--config
- location of the configuration file. configuration file must exist--database
- location of the database file.
Exit Status Codes
Code | Meaning |
---|---|
0 | Success |
1 | Unknwon error |
2 | I/O error |
3 | Shutdown requested |
4 | Insufficient funds |
5 | Gas too low |
6 | Gas price is too low |
7 | Nonce reused |
10 | Cannot connect |
11 | Connection lost |
12 | Bridge crashed |
20 | RPC error |
file example
Configurationkeystore = "/path/to/keystore"
[home]
account = "0x006e27b6a72e1f34c626762f3c4761547aff1421"
rpc_host = "http://localhost"
rpc_port = 8545
required_confirmations = 0
password = "home_password.txt"
default_gas_price = 10
[foreign]
account = "0x006e27b6a72e1f34c626762f3c4761547aff1421"
rpc_host = "http://localhost"
rpc_port = 9545
required_confirmations = 0
password = "foreign_password.txt"
default_gas_price = 20
[authorities]
accounts = [
"0x006e27b6a72e1f34c626762f3c4761547aff1421",
"0x006e27b6a72e1f34c626762f3c4761547aff1421",
"0x006e27b6a72e1f34c626762f3c4761547aff1421"
]
required_signatures = 2
[transactions]
deposit_relay = { gas = 3000000, gas_price = 1000000000 }
withdraw_relay = { gas = 3000000, gas_price = 1000000000 }
withdraw_confirm = { gas = 3000000, gas_price = 1000000000 }
Options
keystore
- path to a keystore directory with JSON keys
home/foreign options
home/foreign.account
- authority address on the home (required)home/foreign.rpc_host
- RPC host (required)home/foreign.rpc_port
- RPC port (defaults to 8545)home/foreign.required_confirmations
- number of confirmation required to consider transaction final on home (default: 12)home/foreign.poll_interval
- specify how often home node should be polled for changes (in seconds, default: 1)home/foreign.request_timeout
- specify request timeout (in seconds, default: 3600)home/foreign.password
- path to the file containing a password for the validator's account (to decrypt the key from the keystore)home/foreign.gas_price_oracle_url
- the URL used to query the current gas price for the home and foreign nodes.home/foreign.gas_price_timeout
- the number of seconds to wait for an HTTP response from the gas price oracle before using the default gas price.home/foreign.gas_price_speed_type
- use the gas price from the oracle URL corresponding to this transaction speed.home/foreign.default_gas_price
- the default gas price in GWEI used in transactions with the home or foreign node. The default gas price is used when the gas price oracle cannot be URL cannot be reached.
authorities options
authorities.account
- all authorities (required)authorities.required_signatures
- number of authorities signatures required to consider action final (required)
transaction options
transaction.deposit_relay.gas
- specify how much gas should be consumed by deposit relaytransaction.deposit_relay.gas_price
- specify gas price for deposit relaytransaction.deposit_relay.concurrency
- how many concurrent transactions can be sent (default: 100)transaction.withdraw_confirm.gas
- specify how much gas should be consumed by withdraw confirmtransaction.withdraw_confirm.gas_price
- specify gas price for withdraw confirmtransaction.withdraw_confirm.concurrency
- how many concurrent transactions can be sent (default: 100)transaction.withdraw_relay.gas
- specify how much gas should be consumed by withdraw relaytransaction.withdraw_relay.gas_price
- specify gas price for withdraw relaytransaction.withdraw_relay.concurrency
- how many concurrent transactions can be sent (default: 100)
Database file format
home_contract_address = "0x49edf201c1e139282643d5e7c6fb0c7219ad1db7"
foreign_contract_address = "0x49edf201c1e139282643d5e7c6fb0c7219ad1db8"
checked_deposit_relay = 120
checked_withdraw_relay = 121
checked_withdraw_confirm = 121
all fields are required
home_contract_address
- address of the bridge contract on home chainforeign_contract_address
- address of the bridge contract on foreign chainchecked_deposit_relay
- number of the last block for which an authority has relayed deposits to the foreignchecked_withdraw_relay
- number of the last block for which an authority has relayed withdraws to the homechecked_withdraw_confirm
- number of the last block for which an authority has confirmed withdraw