mirror of https://github.com/qortal/qortal
catbref
4 years ago
4 changed files with 95 additions and 6 deletions
@ -1,5 +1,19 @@
|
||||
# Auto Updates |
||||
|
||||
## TL;DR: how-to |
||||
|
||||
* Assuming you are in git 'master' branch, at HEAD |
||||
* Shutdown local node if running |
||||
* Build auto-update download: `tools/build-auto-update.sh` - uploads auto-update file into new git branch |
||||
* Restart local node |
||||
* Publish auto-update transaction using *private key* for **non-admin** member of "dev" group: |
||||
`tools/publish-auto-update.sh non-admin-dev-member-private-key-in-base58` |
||||
* Wait for auto-update `ARBITRARY` transaction to be confirmed into a block |
||||
* Have "dev" group admins 'approve' auto-update using `tools/approve-auto-update.sh` |
||||
This tool will prompt for *private key* of **admin** of "dev" group |
||||
* A minimum number of admins are required for approval, and a minimum number of blocks must pass also. |
||||
* Nodes will start to download, and apply, the update over the next 20 minutes or so (see CHECK_INTERVAL in AutoUpdate.java) |
||||
|
||||
## Theory |
||||
* Using a specific git commit (e.g. abcdef123) we produce a determinstic JAR with consistent hash. |
||||
* To avoid issues with over-eager anti-virus / firewalls we obfuscate JAR using very simplistic XOR-based method. |
||||
@ -25,8 +39,8 @@ The same method is used to obfuscate and de-obfuscate:
|
||||
|
||||
## Typical download locations |
||||
The git SHA1 commit hash is used to replace `%s` in various download locations, e.g.: |
||||
* https://github.com/QORT/qortal/raw/%s/qortal.update |
||||
* https://[email protected]/QORT/qortal/%s/qortal.update |
||||
* https://github.com/Qortal/qortal/raw/%s/qortal.update |
||||
* https://[email protected]/Qortal/qortal/%s/qortal.update |
||||
|
||||
These locations are part of the org.qortal.settings.Settings class and can be overriden in settings.json like: |
||||
``` |
||||
|
@ -0,0 +1,69 @@
|
||||
# How to build a testnet |
||||
|
||||
## Create testnet blockchain config |
||||
|
||||
- You can begin by copying the mainnet blockchain config `src/main/resources/blockchain.json` |
||||
- Insert `"isTestChain": true,` after the opening `{` |
||||
- Modify testnet genesis block |
||||
|
||||
### Testnet genesis block |
||||
|
||||
- Set `timestamp` to a nearby future value, e.g. 15 mins from 'now' |
||||
This is to give yourself enough time to set up other testnet nodes |
||||
- Retain the initial `ISSUE_ASSET` transactions! |
||||
- Add `ACCOUNT_FLAGS` transactions with `"andMask": -1, "orMask": 1, "xorMask": 0` to create founders |
||||
- Add at least one `REWARD_SHARE` transaction otherwise no-one can mint initial blocks! |
||||
You will need to calculate `rewardSharePublicKey` (and private key), |
||||
or make a new account on mainnet and use self-share key values |
||||
- Add `ACCOUNT_LEVEL` transactions to set initial level of accounts as needed |
||||
- Add `GENESIS` transactions to add QORT/LEGACY_QORA funds to accounts as needed |
||||
|
||||
## Testnet `settings.json` |
||||
|
||||
- Create a new `settings-test.json` |
||||
- Make sure to add `"isTestNet": true,` |
||||
- Make sure to reference testnet blockchain config file: `"blockchainConfig": "testchain.json",` |
||||
- It is a good idea to use a separate database: `"repositoryPath": "db-testnet",` |
||||
- You might also need to add `"bitcoinNet": "TEST3",` and `"litecoinNet": "TEST3",` |
||||
|
||||
## Other nodes |
||||
|
||||
- Copy `testchain.json` and `settings-test.json` to other nodes |
||||
- Alternatively, you can run multiple nodes on the same machine by: |
||||
* Copying `settings-test.json` to `settings-test-1.json` |
||||
* Configure different `repositoryPath` |
||||
* Configure use of different ports: |
||||
+ `"apiPort": 22391,` |
||||
+ `"listenPort": 22392,` |
||||
|
||||
## Starting-up |
||||
|
||||
- Start up at least as many nodes as `minBlockchainPeers` (or adjust this value instead) |
||||
- Probably best to perform API call `DELETE /peers/known` |
||||
- Add other nodes via API call `POST /peers <peer-hostname-or-IP>` |
||||
- Add minting private key to node(s) via API call `POST /admin/mintingaccounts <minting-private-key>` |
||||
This key must have corresponding `REWARD_SHARE` transaction in testnet genesis block |
||||
- Wait for genesis block timestamp to pass |
||||
- A node should mint block 2 approximately 60 seconds after genesis block timestamp |
||||
- Other testnet nodes will sync *as long as there is at least `minBlockchainPeers` peers with an "up-to-date" chain` |
||||
- You can also use API call `POST /admin/forcesync <connected-peer-IP-and-port>` on stuck nodes |
||||
|
||||
## Dealing with stuck chain |
||||
|
||||
Maybe your nodes have been offline and no-one has minted a recent testnet block. |
||||
Your options are: |
||||
|
||||
- Start a new testnet from scratch |
||||
- Fire up your testnet node(s) |
||||
- Force one of your nodes to mint by: |
||||
+ Set a debugger breakpoint on Settings.getMinBlockchainPeers() |
||||
+ When breakpoint is hit, change `this.minBlockchainPeers` to zero, then continue |
||||
- Once one of your nodes has minted blocks up to 'now', you can use "forcesync" on the other nodes |
||||
|
||||
## Tools |
||||
|
||||
- `qort` tool, but use `-t` option for default testnet API port (62391) |
||||
- `qort` tool, but first set shell variable: `export BASE_URL=some-node-hostname-or-ip:port` |
||||
- `qort` tool, but prepend with one-time shell variable: `BASE_URL=some-node-hostname-or-ip:port qort ......` |
||||
- `peer-heights`, but use `-t` option, or `BASE_URL` shell variable as above |
||||
|
Loading…
Reference in new issue