Document has steps to configure OpenST platform for development and test environments. For production environment, following steps are not recommended to avoid single point failures and scalability issues caused because of single machine.
You can test platform as standalone system or with Platform RESTful APIs. We have publish this document for both kind of setups.
- Install node version >= 7
- Install geth version >= 1.7.2
- Checkout platform code from repository
> git clone [email protected]:OpenSTFoundation/openst-platform.git
> cd openst-platform
> export OPENST_PLATFORM_PATH=$(pwd)
> echo "export OPENST_PLATFORM_PATH=$(pwd)" >> ~/.bash_profile
- Checkout RESTful APIs code from repository
> git clone [email protected]:OpenSTFoundation/openst-platform-apis.git
> cd openst-platform-apis
> export OPENST_PLATFORM_PATH=$(pwd)/node_modules/@openstfoundation/openst-platform
> echo "export OPENST_PLATFORM_PATH=$(pwd)/node_modules/@openstfoundation/openst-platform" >> ~/.bash_profile
- Install all required node modules
> npm install
> ~/dynamodb_local_latest/
- Start the openST platform setup
> node $OPENST_PLATFORM_PATH/tools/setup/index.js
Setup will create "openst-setup" folder in your HOME folder with following folders and files:
- openst-geth-value - Acts as ethereum MainNet for development/test environment using POW consensus algorithm.
- openst-geth-utility - Acts as openST side chain network for development/test environment using POA consensus algorithm.
- bin - Contain multiple executables for ethereum chains and platform services
- logs - Contain logs generated by executables in bin folder
- openst_env_vars.sh - Platform related environment variables
> ls -alt $HOME/openst-setup/
(Optional) Configure Cache and Notification layers in setup
The default Platform setup is done with "in-process" caching and EventEmitter notifications. To use different caching and notifications implementation, edit $HOME/openst-setup/openst_env_vars.sh file
> cat $HOME/openst-setup/openst_env_vars.sh
- Load platform environment variables
> source $HOME/openst-setup/openst_env_vars.sh
- Start all platform services in background
> node $OPENST_PLATFORM_PATH/tools/setup/start_services.js
Important Note: Wait until all service are up and running. A success message will be displayed when everything is good to go. Let this script be running while branded tokens are registered and minted.
Note: Script also monitor these services and alert if any required service terminates.
-
Optional steps on separate Terminals
- Listen notifications published from platform over RabbitMQ
> source $HOME/openst-setup/openst_env_vars.sh > node $OPENST_PLATFORM_PATH/executables/notification_subscribe.js
- All logs created by different services are present in logs folder
> ls -alt $HOME/openst-setup/logs/
[x] On Terminal 2 - Once all required services are up and running, let's onboard our first branded token
- Load platform environment variables
> source $HOME/openst-setup/openst_env_vars.sh
- Onboard/Register Branded Token - Registration requires three input parameters:
- Name - branded token name (example: "ACME Coin")
- Symbol - branded token symbol (example: "ACME")
- Conversion Factor - branded token to OST conversion factor, 1 OST = x BT (example: 10).
- This is a number and has a precision of 5.
- This cannot be 0
- Valid examples:
1.0
,0.222
,.3
,1000
,15.001
- Invalid examples:
2.002222
,0
,xyz
> node $OPENST_PLATFORM_PATH/tools/setup/branded_token/register.js "ACME Coin" "ACME" 10
NOTE: Upon successful registration, branded token details will be published in the branded token configuration file.
> cat $HOME/openst-setup/branded_tokens.json
{
"0x9b8f63ed597ca654262e21647d59f5ef495d173909d7816982d367b85f5ebc76": {
"Name": "ACME Coin",
"Symbol": "ACME",
"ConversionFactor": 10,
"Reserve": "0xEB05083DE29860b912151d93DB24C55b7beB6936", // Branded Token owner address on utility chain
"ReservePassphrase": "acmeOnopenST",
"UUID": "0x9b8f63ed597ca654262e21647d59f5ef495d173909d7816982d367b85f5ebc76",
"ERC20": "0x3B662406CCab34fd2Ce81Bf7154987DDCE82F6EF" // Branded Token EIP20 contract address
}
}
- Mint branded tokens and get ST' (gas) on utility chain by staking OST - Minting requires 2 input arguments:
- Symbol - branded token symbol (example: "ACME")
- Amount - The OST amount in Weis to stake, where 1 OST = (1 X 10^18) OST Wei (example: 500 OST = 500000000000000000000 OST Wei)
> node $OPENST_PLATFORM_PATH/tools/setup/branded_token/mint.js "ACME" 500000000000000000000
NOTE: Upon successful minting, Branded Token reserve address will receive branded tokens, of worth 90% of staked OST, and ST' (gas for OpenST utility chain), of worth 10% of staked OST.
Example: For 500 OST, reserve address will get:
- 4500 ACME tokens ((90% of 500 staked OST) * (10 as conversion factor))
- 50 ST' ((10% of 500 staked OST) * (1 as conversion factor))
[x] Back on Terminal 1 - Stop start_services.js script, if you don't want to register and mint more branded tokens on utility chain.
- Start utility chain in new terminal
> source $HOME/openst-setup/openst_env_vars.sh
> sh $HOME/openst-setup/bin/run-utility.sh
- Start value chain in new terminal
> source $HOME/openst-setup/openst_env_vars.sh
> sh $HOME/openst-setup/bin/run-value.sh
- Start application server in new terminal
> source $HOME/openst-setup/openst_env_vars.sh
> node app.js
- Use PostMan files for Platform RESTful Apis testing and reference: https://github.com/OpenSTFoundation/openst-platform-apis/tree/master/postman
- Start utility chain in new terminal
> source $HOME/openst-setup/openst_env_vars.sh
> sh $HOME/openst-setup/bin/run-utility.sh
- Start value chain in new terminal
> source $HOME/openst-setup/openst_env_vars.sh
> sh $HOME/openst-setup/bin/run-value.sh
- Open node console in new terminal
> source $HOME/openst-setup/openst_env_vars.sh
> node
- Generate new address on utility chain
var platformServices = require('./index');
var serviceObj = new platformServices.services.utils.generateAddress({passphrase: 'my-secret-pass', chain: 'utility'});
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
- Get branded token details
var os = require('os');
var brandedTokenConfig = require(os.homedir() + "/openst-setup/branded_tokens.json");
var uuid = Object.keys(brandedTokenConfig)[0];
var platformServices = require('./index');
var serviceObj = new platformServices.services.utils.getBrandedTokenDetails({uuid: uuid});
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
- Transfer branded token on utility chain
var os = require('os');
var brandedTokenConfig = require(os.homedir() + "/openst-setup/branded_tokens.json");
var brandedTokenDetails = brandedTokenConfig[Object.keys(brandedTokenConfig)[0]];
var data = {
erc20_address: brandedTokenDetails['ERC20'],
sender_address: brandedTokenDetails['Reserve'],
sender_passphrase: brandedTokenDetails['ReservePassphrase'],
recipient_name: 'foundation',
amount_in_wei: 2,
options: {
returnType: 'txReceipt',
tag: 'ILoveOST'
}
};
var platformServices = require('./index');
var serviceObj = new platformServices.services.transaction.transfer.brandedToken(data);
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
- Transfer OST on value chain
var platformServices = require('./index');
var serviceObj = new platformServices.services.transaction.transfer.simpleToken({sender_name: 'foundation', recipient_name: 'utilityChainOwner', amount_in_wei: 10, options: {returnType: 'txHash', tag: 'Grant'}});
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
- Transfer Ether on value chain
var platformServices = require('./index');
var serviceObj = new platformServices.services.transaction.transfer.eth({sender_name: 'foundation', recipient_name: 'utilityChainOwner', amount_in_wei: 10000, options: {returnType: 'txHash', tag: 'GasRefill'}});
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
- Transfer ST' (gas) on utility chain
var platformServices = require('./index');
var serviceObj = new platformServices.services.transaction.transfer.simpleTokenPrime({sender_name: 'utilityChainOwner', recipient_name: 'foundation', amount_in_wei: 10, options: {returnType: 'txHash', tag: 'GasRefill'}});
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
- Get transaction receipt
var platformServices = require('./index');
var serviceObj = new platformServices.services.transaction.getReceipt({chain: 'utility', transaction_hash: '0xe4945b1c90d291074b74c9ed211c6fbae2702d1bd33e7b53c3f55a6b3c62c270'});
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
- Get branded token balance
var os = require('os');
var brandedTokenConfig = require(os.homedir() + "/openst-setup/branded_tokens.json");
var brandedTokenDetails = brandedTokenConfig[Object.keys(brandedTokenConfig)[0]];
var data = {address: brandedTokenDetails['Reserve'], erc20_address: brandedTokenDetails['ERC20']};
var platformServices = require('./index');
var serviceObj = new platformServices.services.balance.brandedToken(data);
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
- Get OST balance
var platformServices = require('./index');
var serviceObj = new platformServices.services.balance.simpleToken({address: process.env.OST_FOUNDATION_ADDR});
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
- Get ST' (gas) balance
var platformServices = require('./index');
var serviceObj = new platformServices.services.balance.simpleTokenPrime({address: process.env.OST_UTILITY_CHAIN_OWNER_ADDR});
serviceObj.perform().then(function(response) {
if (response.isSuccess()){
console.log(response.data);
} else {
console.log(response.err)
}
});
For complete implementation details of OpenST Platform, please refer API documentation.