Skip to content

althea-net/guac_rs

Repository files navigation

Guac light client

Guac is an Ethereum single hop payment channel client for the Guac payment channel contract. This light client is able to send and verify channel opening, updating, and ending transactions. It relies on one or several bounty hunting full nodes which relay transactions onto the blockchain. These bounty hunting nodes are not able to spend any money without the permission of this light client, but they could censor its transactions, in the worst case leading to the loss of some funds stored in the channel. For this reason it is advisable to connect to several bounty hunting nodes.

TODO:

  • Finish unit tests
  • Add checkAccrual (formerly withdraw) function to userAPI
  • Add bounty hunter updates
  • Add real signature verification
  • Add withdraw function to userApi

Guac APIs

Guac effectively has 2 APIs- a counterparty API which is called by other Guac nodes, and a user api which is called by the user (or a piece of software acting on behalf of the user).

Counterparty API

This is called by other Guac nodes.

Propose Channel

Asks a counterparty to sign a newChannel contract tx

Endpoint: /propose_channel

Request data type: Channel (basically all the info you need to call the newChannel contract call.

return type: Signature on the newChannel contract tx

Propose ReDraw

Asks a counterparty to sign a reDraw contract tx, to add or withdraw money on our side from the channel.

Endpoint: /propose_redraw

Request data type: TBD

return type: Signature on the newChannel call

Update

Tells your counterparty about your new state

Endpoint: /update

Request data type: UpdateTx Return data type: UpdateTx (containing the newest transaction data from their local state)

ChannelOpened notification

Notifies a counterparty who has just responded affirmatively to a propose channel call that the channel has been opened on the blockchain.

Request data type: Channel

return data type: null

ReDraw notification

Notifies a counterparty who has just responded affirmatively to a reDraw call that the channel has been reDrawn on the blockchain.

Request data type: Channel

return data type: null

User API

This is called by the user (or a piece of software acting on behalf of the user).

Register

This is used to register a new counterparty.

Fill Channel

This is used to open a channel with a counterparty that we wish to pay in the future. This incurs a gas cost.

Make Payment

This is used to make a payment to a counterparty. This does not incur a gas cost.

Check Accrual

NOTE: This is currently called "Withdraw" in the code. It needs to be renamed to avoid confusion.

This method is somewhat nuanced. It is used to check how much payment has been received from a counterparty since the last time the method was called. It does not take payments we send the counterparty into account. That is, if you send me 10, then I send you 5, then I call "Check Accrual", I will see that I have received 10 from you.

for example:

  • A: 100, B: 100
  • A <-10-- B
  • A: 110, B: 90
  • A calls "Check Accrual": 10
  • A calls "Check Accrual": 0

  • A <-10-- B
  • A: 120, B:80
  • A --5-> B
  • A: 115, B:85
  • A calls "Check Accrual": 10

  • A --10-> B
  • A: 105, B: 95
  • A <-5-- B
  • A calls "Check Accrual": 5

Withdraw

This allows you to withdraw some or all of your balance from a channel. This incurs a gas cost.

Refill

This allows you to refill a channel that is getting low to avoid a disruption of service by not being able to pay a counterparty while a new channel is being opened. This incurs a gas cost.

Close

This is used to close a channel. Under the hood, it calls the blockchain to start the channel's challenge period. Then it tells the counterparty to call the close channel function on the contract, resulting in a fast close.

File structure

Guac is structured into 3 modules, guac_core which consists of the implementation of the channel update logic as well as interaction with the blockchain through bounty hunters. guac_actix is an interface over guac_core which sends and receives messages from the external world via HTTP, but receives commands via actix. guac_http makes the command interface HTTP instead to provide wider interoperability.

Development

Set up git hooks:

cd .git/hooks/
ln -s ../../.git-hooks/pre-commit

Running tests

Tests are run from the guac_http crate, which imports logic from guac_core. To prepare your environment for testing, you can run the ./scripts/local-setup.sh script. This will clone the althea-mesh/guac Github repo into ./.contract, start an instance of Ganache in the background (Ganache is a local Ethereum chain), compile and deploy the contract to this chain, and save the address of the contract and two test accounts into ./guac_http/config.toml, where they can be read by the tests.

If you want to test against a new version of althea-mesh/guac, delete the ./.contract folder and run the ./scripts/local-setup.sh script again.

./scripts/local-setup.sh logs verbose output from Ganache to ./.ganache-log.

WARNING: ./scripts/local-setup.sh will stop any process running on port 8545.

guac_http uses the config_struct crate to load