Tiramisu is a "Layer Two" system for scalable token transfers that prioritizes simplicity.
Tiramisu is a framework for performing ERC20 token transfers at a fraction of the cost of a standard transfer.
It accomplishes this by aggregating transactions and committing them into blocks. However, it does not perform any on-chain computation for the transactions themselves. Instead, it simply includes a merkle root of the new account state along with the transaction data for each block. If some part of a block is invalid, anyone can submit a proof to that effect within a challenge period. Should they do so, they earn a reward and trigger a roll-back of the state.
Tiramisu is a member of the group of "fraud proof rollup" (or "optimistic rollup") Layer Two technologies. That being said, Tiramisu prioritizes simplicity over raw scalability or generalizability — it designates a single block producer, and the only permitted operations are deposits, transfers, withdrawals, and authorization of additional signing keys.
These operations are broken down into two high-level categories:
- Hard transactions, including deposits and direct withdrawals or signing key additions, can only be initiated from a corresponding account on mainnet. These are placed in a queue as soon as the Tiramisu contract is called, and must be processed by the block producer in the order they are received.
- Soft transactions, including transfers and standard withdrawals or signing key modifications, require a signature from a designated signer, and the block producer can choose whether or not to include a given soft transaction in a block.
See the specification for a more detailed overview of the design decisions behind Tiramisu.
To install locally, you'll need Node.js 10 through 12 and Yarn (or npm). Then, perform the following:
$ git clone https://github.com/dharma-eng/Tiramisu.git
$ cd Tiramisu
$ yarn install
Once you've successfully pulled down the code and installed all dependencies, you'll need to compile both the application code (using TypeScript) as well as the contracts (using Truffle):
$ yarn build:ts # compiles app/ and places output in dist/
$ yarn build:sol # compiles contracts/ and places output in build/
To run all the typescript tests in test/tests/
:
$ yarn test:app
You can also run tests directly if you prefer for the blockchain class, the state wrapper class, or the state machine class that executes transactions:
$ yarn test:blockchain
$ yarn test:state
$ yarn test:transactions
To generate application test coverage using nyc:
$ yarn test:coverage:app
To generate contract test coverage using Truffle with the solidity-coverage plugin:
$ yarn test:coverage:sol
To run contract linters:
$ yarn lint
This repository is maintained by @0age, @d1ll0n, and @anna-carrol.
Have any questions or feedback? Join the conversation in the Dharma_HQ Discord server.