Clean your room, kiddo.
This commit is contained in:
parent
926913da50
commit
7dc75a19b5
122
README.md
122
README.md
@ -15,19 +15,24 @@ It uses the [Truffle framework](http://truffleframework.com/) for some things.
|
|||||||
|
|
||||||
All requirements are defined in `package.json`.
|
All requirements are defined in `package.json`.
|
||||||
|
|
||||||
Those can be installed globally for convenience:
|
Those can be installed globally for convenience:
|
||||||
|
|
||||||
* [truffle framework](http://truffleframework.com): `npm install -g truffle`
|
* [truffle framework](http://truffleframework.com): `npm install -g truffle`
|
||||||
* [ganache](http://truffleframework.com/ganache): `npm install -g ganache-cli`
|
* [ganache](http://truffleframework.com/ganache): `npm install -g ganache-cli`
|
||||||
|
|
||||||
We use following solidity contract libraries:
|
We use following solidity contract libraries:
|
||||||
|
|
||||||
* [Open Zeppelin](https://github.com/OpenZeppelin/zeppelin-solidity)
|
* [Open Zeppelin](https://github.com/OpenZeppelin/zeppelin-solidity)
|
||||||
|
|
||||||
For local development it is recommended to use [ganache-cli](https://github.com/trufflesuite/ganache-cli) (or the [ganache GUI](http://truffleframework.com/ganache/) to run a local development chain.
|
For local development it is recommended to use
|
||||||
|
[ganache-cli](https://github.com/trufflesuite/ganache-cli) (or the [ganache
|
||||||
|
GUI](http://truffleframework.com/ganache/) to run a local development chain.
|
||||||
Using the ganache simulator no full Ethereum node is required.
|
Using the ganache simulator no full Ethereum node is required.
|
||||||
|
|
||||||
We default to:
|
We default to:
|
||||||
|
|
||||||
* port 7545 for development to not get in conflict with the default Ethereum RPC port.
|
* port 7545 for development to not get in conflict with the default Ethereum
|
||||||
|
RPC port.
|
||||||
* network ID 100 to stay on the same network id
|
* network ID 100 to stay on the same network id
|
||||||
* store ganache data in .ganache-db to presist the chain data across restarts
|
* store ganache data in .ganache-db to presist the chain data across restarts
|
||||||
* use a fixed Mnemonic code to get the same accounts across restarts
|
* use a fixed Mnemonic code to get the same accounts across restarts
|
||||||
@ -40,116 +45,137 @@ Run your ganache simulator before using Kredits locally:
|
|||||||
|
|
||||||
### Truffle console
|
### Truffle console
|
||||||
|
|
||||||
Truffle comes with a simple REPL to interact with the Smart Contracts. Have a look at the [documentation here](http://truffleframework.com/docs/getting_started/console)
|
Truffle comes with a simple REPL to interact with the Smart Contracts. Have a
|
||||||
|
look at the [documentation
|
||||||
|
here](http://truffleframework.com/docs/getting_started/console)
|
||||||
|
|
||||||
NOTE: There are promisses, have a look at the examples:
|
NOTE: There are promisses, have a look at the examples:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
Token.deployed().then(function(token) {
|
Token.deployed().then(function(token) {
|
||||||
token.totalSupply.call().then(function(value) {
|
token.totalSupply.call().then(function(value) {
|
||||||
console.log(value.toString());
|
console.log(value.toString());
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
Also please be aware of the differences between web3.js 0.2x.x and [1.x.x](https://web3js.readthedocs.io/en/1.0/) - [web3 repo](https://github.com/ethereum/web3.js/)
|
Also please be aware of the differences between web3.js 0.2x.x and
|
||||||
|
[1.x.x](https://web3js.readthedocs.io/en/1.0/) - [web3
|
||||||
|
repo](https://github.com/ethereum/web3.js/)
|
||||||
|
|
||||||
## Contract Deployment
|
## Contract Deployment
|
||||||
|
|
||||||
Truffle uses migration scripts to deploy contract to various networks. Have a look at the `migrations` folder for those.
|
Truffle uses migration scripts to deploy contract to various networks. Have a
|
||||||
The Ethereum nodes for the different networks need to be configured in `truffle.js`.
|
look at the `migrations` folder for those. The Ethereum nodes for the
|
||||||
|
different networks need to be configured in `truffle.js`.
|
||||||
|
|
||||||
Run the truffle migration scripts:
|
Run the truffle migration scripts:
|
||||||
|
|
||||||
$ truffle deploy
|
$ truffle deploy
|
||||||
$ truffle deploy --network=<network config from truffle.js>
|
$ truffle deploy --network=<network config from truffle.js>
|
||||||
|
|
||||||
Truffle keeps track of already executed migration scripts. To reset the migration use the `--reset` option
|
Truffle keeps track of already executed migration scripts. To reset the
|
||||||
|
migration use the `--reset` option
|
||||||
|
|
||||||
$ truffle migrate --reset
|
$ truffle migrate --reset
|
||||||
|
|
||||||
Migration scripts can also be run from within `truffle console` or `truffle develop`
|
Migration scripts can also be run from within `truffle console` or `truffle
|
||||||
|
develop`
|
||||||
|
|
||||||
To initially bootstrap a local development chain in ganache you can use the bootstrap script:
|
To initially bootstrap a local development chain in ganache you can use the
|
||||||
|
bootstrap script:
|
||||||
$ npm run bootstrap (= `truffle migrate --reset && truffle exec scripts/seeds.js && npm run build-json`)
|
|
||||||
|
|
||||||
|
$ npm run bootstrap
|
||||||
|
|
||||||
## Helper scripts
|
## Helper scripts
|
||||||
|
|
||||||
`scripts/` contains some helper scripts to interact with the contracts from the CLI.
|
`scripts/` contains some helper scripts to interact with the contracts from the
|
||||||
At some point these should be moved into a real nice CLI.
|
CLI. _At some point these should be moved into a real nice CLI._
|
||||||
|
|
||||||
To run these scripts use `truffle exec`. For example: `truffle exec scripts/add-proposal.js`
|
To run these scripts use `truffle exec`. For example: `truffle exec
|
||||||
|
scripts/add-proposal.js`.
|
||||||
|
|
||||||
### cli.js
|
### cli.js
|
||||||
|
|
||||||
Call any function on any contract:
|
Call any function on any contract:
|
||||||
|
|
||||||
$ truffle exec scripts/cli.js
|
$ truffle exec scripts/cli.js
|
||||||
|
|
||||||
### repl.js
|
### repl.js
|
||||||
Similar to cli.js but only provides a REPL with an initialized `kredits` instance.
|
|
||||||
|
Similar to cli.js but only provides a REPL with an initialized `kredits`
|
||||||
|
instance.
|
||||||
|
|
||||||
$ truffle exec scripts/repl.js
|
$ truffle exec scripts/repl.js
|
||||||
|
|
||||||
### add-contributor.js
|
### add-contributor.js
|
||||||
Adds a new core contributor, creates a proposal for the new contributor and votes for that one.
|
|
||||||
|
|
||||||
$ truffle exec scripts/add-contributor.js
|
Adds a new core contributor, creates a proposal for the new contributor and
|
||||||
|
votes for that one.
|
||||||
|
|
||||||
|
$ truffle exec scripts/add-contributor.js
|
||||||
|
|
||||||
### add-proposal.js
|
### add-proposal.js
|
||||||
|
|
||||||
Adds a new proposal for an existing contributor
|
Adds a new proposal for an existing contributor
|
||||||
|
|
||||||
$ truffle exec scripts/add-proposal.js
|
$ truffle exec scripts/add-proposal.js
|
||||||
|
|
||||||
### send-funds.js
|
### send-funds.js
|
||||||
Sends funds to an address. Helpful in development mode to for example fund a metamask account.
|
|
||||||
|
|
||||||
$ truffle exec scripts/send-funds.js
|
Sends funds to an address. Helpful in development mode to for example fund a
|
||||||
|
metamask account.
|
||||||
|
|
||||||
|
$ truffle exec scripts/send-funds.js
|
||||||
|
|
||||||
### seeds.js
|
### seeds.js
|
||||||
Run seeds defined in `config/seeds.js`.
|
Run seeds defined in `config/seeds.js`.
|
||||||
|
|
||||||
$ truffle exec scripts/seeds.js
|
$ truffle exec scripts/seeds.js
|
||||||
or
|
or
|
||||||
$ npm run seeds
|
$ npm run seeds
|
||||||
|
|
||||||
|
|
||||||
## Upgradeable contracts
|
## Upgradeable contracts
|
||||||
|
|
||||||
Some of the contracts use upgradability ideas from [zeppelinos](https://github.com/zeppelinos/labs) (see `contracts/upgradable`).
|
Some of the contracts use upgradability ideas from
|
||||||
|
[zeppelinos](https://github.com/zeppelinos/labs) (see `contracts/upgradable`).
|
||||||
|
|
||||||
The basic idea is to have a Registry contract that knows about the current implementations and a Proxy contract that uses `delegatecall` to call the current implementation.
|
The basic idea is to have a Registry contract that knows about the current
|
||||||
That means the Proxy contract holds the storage and the address of that one does not change but the actuall implemenation is managed through the Registry.
|
implementations and a Proxy contract that uses `delegatecall` to call the
|
||||||
|
current implementation. That means the Proxy contract holds the storage and
|
||||||
|
the address of that one does not change but the actuall implemenation is
|
||||||
|
managed through the Registry.
|
||||||
|
|
||||||
To deploy a new version a new contract is deployed then the version is registered (`addVersion()`) in the Registry and on the Proxy contract is "upgraded" (`upgrade()`) to the new version.
|
To deploy a new version a new contract is deployed then the version is
|
||||||
|
registered (`addVersion()`) in the Registry and on the Proxy contract is
|
||||||
|
"upgraded" (`upgrade()`) to the new version.
|
||||||
|
|
||||||
The Registry knows about all the different contracts and implementations. Versions are stored as uint and automatically incremented for every added implementation.
|
The Registry knows about all the different contracts and implementations.
|
||||||
|
Versions are stored as uint and automatically incremented for every added
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
### Example:
|
Deployment is best done using the truffle deployer.
|
||||||
|
|
||||||
Deployment is best done using the [truffle deployer]()
|
|
||||||
|
|
||||||
1. Setup
|
1. Setup
|
||||||
1. deploy the Registry
|
1. Deploy the Registry
|
||||||
2. deploy the contract
|
2. Deploy the contract
|
||||||
3. register the contract at the Registry:
|
3. Register the contract at the Registry:
|
||||||
`registry.addVersion('Token', Token.address)`
|
`registry.addVersion('Token', Token.address)`
|
||||||
4. create the Proxy:
|
4. Create the Proxy:
|
||||||
`registry.createProxy('Token', 1)`
|
`registry.createProxy('Token', 1)`
|
||||||
2. Update
|
2. Update
|
||||||
1. deploy a new Version of the contract
|
1. Deploy a new Version of the contract
|
||||||
2. register the new version at the Registry:
|
2. Register the new version at the Registry:
|
||||||
`registry.addVersion('Token', NewToken.address)`
|
`registry.addVersion('Token', NewToken.address)`
|
||||||
3. set the new implementation address on the Proxy contract:
|
3. Set the new implementation address on the Proxy contract:
|
||||||
`registry.upgrade('Token', 2)`
|
`registry.upgrade('Token', 2)`
|
||||||
|
|
||||||
|
|
||||||
## Known Issues
|
## Known Issues
|
||||||
|
|
||||||
When resetting ganache Metamask might have an invalid transaction nonce and transactions get rejected.
|
When resetting ganache Metamask might have an invalid transaction nonce and
|
||||||
Nonces in Ethereum must be incrementing and have no gap.
|
transactions get rejected. Nonces in Ethereum must be incrementing and have no
|
||||||
|
gap.
|
||||||
|
|
||||||
To solve this reset the metamask account (Account -> Settings -> Reset Account)
|
To solve this reset the metamask account (Account -> Settings -> Reset Account)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user