I’m excited to share a quick start guide on how to get Nebulas up and running within minutes.
Install Nebulas
We implement Nebulas in Golang, called “Go-Nebulas”. In this part, I’ll introduce how to install Go-Nebulas on Mac. The procedure is similar to Linux. Feel free to contact us in Slack if you have any questions about Go-Nebulas.
Prepare Go
Make sure the version of Golang ≥ 1.9, and configure GOPATH.
export GOPATH=/path/to/workspace
Clone Repo
Note: We have only ONE official repo now.
mkdir $GOPATH/src/github.com/nebulasio/
cd $GOPATH/src/github.com/nebulasio
git clone https://github.com/nebulasio/go-nebulas.git
Choose Branch
There are three main branches in our repo: develop, testnet and master.
Above is our Git Workflow.
- All new features will be developed in standalone branches, before merging into develop branch.
- After which, we’ll merge all changes into testnet branch and deploy them on the official Testnet.
- If everything works well in the official Testnet, the new features will be accepted by master branch and be deployed on Mainnet.
We always recommend you to use master branch, which is the most stable.
git checkout master
Install Dependencies
Comparing between RocksDB and LevelDB, we chose RocksDB as our default persistent storage for better performance.
Homebrew can be used to install RocksDB in Mac.
brew install rocksdb
For the convenience of most developers today, we chose Javascript (the most popular programming language) as the first smart contract language to be supported by Nebulas. Chrome V8 is also integrated into our virtual machine to execute smart contracts written in Javascript.
We have compiled dynamic libraries of V8 on both Mac and Linux. A single command is required for easy installation.
make deploy-v8
Then, we use golang/dep to install all go dependencies.
brew install dep
make dep
Compile Neb
Now we can build the executable neb.
make build
We’ll get ./neb in current directory.
Launch Nebulas
Based on the configuration, we can use neb to join Mainnet, Testnet or a private net. In this section, I hope to help you launch your first private net. In your private net, you will be able to explore Nebulas freely.
We provided the default configuration for local private net. neb can be launched with it directly.
cd $GOPATH/src/github.com/nebulasio/go-nebulas
./neb -c conf/default/config.conf
If you’ve seen “Started Neblet” printed in console, it means everything works well.
INFO[2018–04–08T17:18:07+08:00] Started Neblet. file=neblet.go func=”neblet.(*Neblet).Start” line=259
In the same way, we have to launch another miner node to mint new blocks so that the submitted transactions can be executed.
cd $GOPATH/src/github.com/nebulasio/go-nebulas
./neb -c conf/example/miner.conf
Congratulations! You have successfully launched Go-Nebulas!
Send Transaction
After the private net launched, you’ll own 100 million tokens in the private net. In this section, I will guide you on how to transfer these tokens between accounts with http requests.
Check Balance
In this private net, 100 million tokens are distributed into twenty accounts evenly. In Nebulas, account and address are one to one.
Select two, check their balance.
> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1Q8mxXp4PtHaXtebhY12BnHEwu4mryEkXH"}'{“result”:{“balance”:”5000000000000000000000000",”nonce”:”0",”type”:87}}> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1RYagU8n3JSuV4R7q4Qs5gQJ3pEmrZd6cJ"}'{“result”:{“balance”:”5000000000000000000000000",”nonce”:”0",”type”:87}}
The unit of balance is Wei (1 NAS = 10¹⁸ Wei). Each of these two accounts has 5 million NAS in the private net.
Account’s nonce in Nebulas is used as a transaction counter in each account, preventing replay attacks. Only after the transaction with nonce N is accepted, the transaction with nonce N+1 can be processed.
Nebulas offers a special feature: Type of account.
Two types of accounts are available now: Normal Account(87) and Smart Contract Account(88). These information is encoded into every address generated by Nebulas.
The type of accounts can be verified according to their addresses without any context. It’s much safer to use them in different scenarios.
Transfer Token
In order to transfer tokens from A to B, A is required to sign a new transaction and send it to a launched neb node.
- Sign a new transaction and get its raw data in base64 encoding.
> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/admin/sign -d '{"transaction":{"from":"n1Q8mxXp4PtHaXtebhY12BnHEwu4mryEkXH","to":"n1RYagU8n3JSuV4R7q4Qs5gQJ3pEmrZd6cJ", "value":"1000000000000000000","nonce":1,"gasPrice":"1000000","gasLimit":"2000000"}, "passphrase":"passphrase"}'{“result”:{“data”:”CiDeG1hvAirdI85PlzKejLYpt8dI2ctS6K+HImH2A9p9chIaGVdphHtJoAmJkrt6HOiivNI3fQxrhux0NZAaGhlXeP0tS1WtTIWeOkHelwMW3MZLpO4ia4dzIhAAAAAAAAAAAA3gtrOnZAAAKAEw/9un1gU6CAoGYmluYXJ5QGRKEAAAAAAAAAAAAAAAAAAPQkBSEAAAAAAAAAAAAAAAAAAehIBYAWJBIkg6k+NKV53tYSllF/Ka29TCUfgZr3l2qOBq6Zo79Ss68ugn2253ola958b65LGOb1mQG85nYRL+PsCDL34d8wA=”}}
2. Send the transaction to the launched neb node.
> curl -i -H ‘Content-Type: application/json’ -X POST http://localhost:8685/v1/user/rawtransaction -d ‘{“data”:”CiDeG1hvAirdI85PlzKejLYpt8dI2ctS6K+HImH2A9p9chIaGVdphHtJoAmJkrt6HOiivNI3fQxrhux0NZAaGhlXeP0tS1WtTIWeOkHelwMW3MZLpO4ia4dzIhAAAAAAAAAAAA3gtrOnZAAAKAEw/9un1gU6CAoGYmluYXJ5QGRKEAAAAAAAAAAAAAAAAAAPQkBSEAAAAAAAAAAAAAAAAAAehIBYAWJBIkg6k+NKV53tYSllF/Ka29TCUfgZr3l2qOBq6Zo79Ss68ugn2253ola958b65LGOb1mQG85nYRL+PsCDL34d8wA=”}’{“result”:{“txhash”:”de1b586f022add23ce4f97329e8cb629b7c748d9cb52e8af872261f603da7d72",”contract_address”:””}}
Check Receipt
If we try to check the receipt of the transaction immediately, we’ll find the status is “2”, which means that the transaction is pending.
> curl -i -H ‘Content-Type: application/json’ -X POST http://localhost:8685/v1/user/getTransactionReceipt -d ‘{“hash”:”de1b586f022add23ce4f97329e8cb629b7c748d9cb52e8af872261f603da7d72"}’{"result":{"hash":"de1b586f022add23ce4f97329e8cb629b7c748d9cb52e8af872261f603da7d72","chainId":100,"from":"n1Q8mxXp4PtHaXtebhY12BnHEwu4mryEkXH","to":"n1RYagU8n3JSuV4R7q4Qs5gQJ3pEmrZd6cJ","value":"1000000000000000000","nonce":"1","timestamp":"1523183103","type":"binary","data":null,"gas_price":"1000000","gas_limit":"2000000","contract_address":"","status":2,"gas_used":""}}
Wait for a few seconds before checking the receipt again. The status will become “1”, which means that the transaction is accepted.
> curl -i -H ‘Content-Type: application/json’ -X POST http://localhost:8685/v1/user/getTransactionReceipt -d ‘{“hash”:”de1b586f022add23ce4f97329e8cb629b7c748d9cb52e8af872261f603da7d72"}’{"result":{"hash":"de1b586f022add23ce4f97329e8cb629b7c748d9cb52e8af872261f603da7d72","chainId":100,"from":"n1Q8mxXp4PtHaXtebhY12BnHEwu4mryEkXH","to":"n1RYagU8n3JSuV4R7q4Qs5gQJ3pEmrZd6cJ","value":"1000000000000000000","nonce":"1","timestamp":"1523183103","type":"binary","data":null,"gas_price":"1000000","gas_limit":"2000000","contract_address":"","status":1,"gas_used":"20000"}}
We’ve finished the transaction successfully!
Double Check
In theory, the two accounts’ states should have been updated.
> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1Q8mxXp4PtHaXtebhY12BnHEwu4mryEkXH"}'{"result":{"balance":"4999998999999980000000000","nonce":"1","type":87}}> curl -i -H 'Content-Type: application/json' -X POST http://localhost:8685/v1/user/accountstate -d '{"address":"n1RYagU8n3JSuV4R7q4Qs5gQJ3pEmrZd6cJ"}'{"result":{"balance":"5000001000000000000000000","nonce":"0","type":87}}
The first account will have 1 NAS taken and some Gas fee paid, while the second account will receive that 1 NAS.
All is going well! Congratulations on sending your first private net NAS successfully!
What’s next?
We will be covering the following guides in the next few blog posts to come.
- How to create a new account?
- How to ensure a successful transaction?
- How to deploy and call a smart contract?
- How to subscribe events?
- How to join Testnet and Mainnet?
And many more… Stay tuned!