Ethereum
Ethereum is a crypto platform for running smart contracts and exchanging Ether.
My address is 0xd2f887eda1b28c8714dbb2cf63a59f77fb68fb94
Clients
There are a few clients that you can use.
Go-Ethereum (geth)
The Ethereum client written in Go.
Setup
To compile geth, ensure that you have go, gcc, and make installed. Then run:
$ git clone https://github.com/ethereum/go-ethereum
$ cd go-ethereum
$ make geth
geth will be compiled in build/bin/geth.
Usage
When starting geth, it will automatically start downloading the blockchain. It depends on UDP/30303. Ideally, the client should be accessible publicly via that port.
The default cache size used by geth is quite small, so for an initial sync run:
$ geth --datadir /path/to/ethereum-data --cache=1024
Whilst it is syncing, you can check the state of the client by starting and attaching an interactive console:
$ geth attach
> net.listening
true
> admin.peers
> eth.syncing
To create a private net, provide a custom --networkid value or provide a genesis json file with --genesis.
Other things you may want to do are:
| Task | Command |
|---|---|
| Create an account. Similar to creating a new address. | > personal.newAccount("Write here a good, randomly generated, passphrase!")
|
| Show account balance | > web3.fromWei(eth.getBalance(eth.coinbase), "ether")
|
| Show account address | > eth.coinbase
## or
> eth.accounts[0]
|
| Start CPU mining. Useful on testnets | > miner.setEtherbase(eth.accounts[0])
> miner.start()
|
CPP-Ethereum (eth)
The official C++ version of the Ethereum client.
Setup Overview
On a Fedora 22 machine, you will need to:
- Download and compile the most recent version of LLVM. The packaged version of LLVM available from the official repositories is only version 3.7.
- Git clone v0.4.1 branch of the libjson-rpc-cpp code base. Versions higher may not compile. The most recent version fails due to dependency issues. Install to /usr or /opt/
- Install QT5.5 from the official website using their binary blob installer. The official repository does not have QT5 webengine. Neither does the official source.
- Compile ethereum using the dependencies installed above.
Some dependencies:
# yum -y install libffi-devel cryptopp cryptopp-devel \
argtable argtable-devel libmicrohttpd libmicrohttpd libmicrohttpd-devel \
cmake jsoncpp-devel jsoncpp gmp-devel \
leveldb-devel leveldb-devel pocl
Build LLVM 3.8
{{highlight|lang=terminal|code= $ git clone http://llvm.org/git/llvm.git $ cd llvm $ mkdir build ; cd build $ ../configure --prefix=/opt/llvm --enable-libffi $ make -j 8 $ make install }
Build libjson-rpc-cpp
$ git clone https://github.com/cinemast/libjson-rpc-cpp
$ cd libjson-rpc-cpp
$ git checkout tags/v0.4.1
$ mkdir -p build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..
$ make
$ sudo make install
$ sudo ldconfig
Build Ethereum
You may want to make a symlink for llvm/include/llvm-c and llvm/include/llvm in /usr so that the cmake files can find it. Defining LLVM_DIR is not sufficient.
$ git clone ethereum-cpp
$ cd ethereum-cpp
$ mkdir build
$ cd build
$ LLVM_DIR=/opt/llvm/include CMAKE_PREFIX_PATH=/opt/llvm/include:/opt/Qt5.5.0/Tools:/opt/Qt5.5.0/5.5/gcc_64/ cmake -DCMAKE_INSTALL_PREFIX=/opt/ethereum ..
Other
Backing up your key
Copy the ~/.ethereum/keystore as a backup. It contains your encrypted key. Also, don't forget your passphrase.
Private Test Net
To start your own test network with your own ether, install geth and then do the following:
$ mkdir /tmp/eth/70
$ geth console
## In geth console:
$ personal.newAccount('password')
$ eth.accounts[0]
## you can check the eth.accounts[0] address, copy it and memo to somewhere
## control + c then escape from geth console.
## next make the private net genesisblock json file.
vim privatenet_genesis_block.json
## this is my sample of testnet genesis block json
{
"nonce": "0xlitebeefdeadbeef",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x634f727365",
"gasLimit": "0x8000000",
"difficulty": "0x400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {
}
}
## then use the previous eth.accounts[0] value as the etherbase value.
## The datadir should be somewhere else.
geth --datadir="/tmp/eth/70" --etherbase="{should be input }" --genesis privatenet_genesis_block.json console
privatenet
Example:
$ ./geth --networkid 34093 --genesis ~/ethereum/genesis.json --datadir ~/ethereum --etherbase="0xdc9b165c433c8a6ae48713e8eae926767af0bca0" console
$ miner.start(1)
Then attach to the instance with:
$ ./geth --networkid 34093 --genesis ~/ethereum/genesis.json --datadir ~/ethereum --etherbase="0xdc9b165c433c8a6ae48713e8eae926767af0bca0" --ipcpath ~/ethereum/geth.ipc attach
Dapp Information
TBA
See Also
Greeter contract tutorial
Contract Guide
DApp Tutorial