Ethereum

From Leo's Notes
Revision as of 03:52, 30 June 2017 by Leo (talk | contribs)
This page was last edited on 30 June 2017, at 03:52.

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:

  1. Download and compile the most recent version of LLVM. The packaged version of LLVM available from the official repositories is only version 3.7.
  2. 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/
  3. 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.
  4. 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