以太坊开发--geth的使用入门

一、环境配置和程序安装

1.1 安装 geth

MAC OSX

首先确保已安装 homebrew,没有安装过的可以在命令行下执行/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 进行安装
brew tap ethereum/ethereum
brew install ethereum

WINDOWS

访问 https://geth.ethereum.org/downloads/
下载并安装 Geth for Windows

LINUX

git clone https://github.com/ethereum/go-ethereum
sudo apt-get install -y build-essential golang
cd go-ethereum
make geth

在命令行下输入 geth -h , 有如下回显表示成功


1.2 安装 solc

首先确保安装过npm, 没有安装过的可以访问 npm网站下载安装
npm install -g solc
在命令行下输入 solc --help , 有如下回显表示成功


二、配置私链节点

2.1 创世块设置

新建文件夹,命名随意,在此文件夹下创建genesis.json文件和data文件夹
genesis.json 的内容如下:

{
"config": {
        "chainId": 123456,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
},
"nonce": "0x0000000000000042",
"difficulty": "0x020000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
" coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0x4c4b40",
"alloc": {}
}


2.2 初始化

在命令行下进入刚才创建的文件夹,输入如下命令:
geth --datadir data init genesis.json

各参数代表的含义如下:

init 表示初始化区块,后面跟着创世块的配置文件genesis.json
datadir 数据存放的位置

2.3 启动节点

geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console

各参数代表的含义如下:

networkid 设置当前区块链的网络ID,用于区分不同的网络,1表示公链
rpc 表示启动rpc通信,可以进行智能合约的部署和调试
console 表示启动命令行模式,可以在Geth中执行命令

执行成功后将进入区块链的JavaScript控制台环境


2.4 Geth JavaScript控制台环境使用说明

创建新账号
personal.newAccount()
或者 personal.newAccount("123456")

查看节点信息
admin.nodeInfo

挖矿
开始挖矿 miner.start(1)
停止挖矿 miner.stop()

查看当前矿工账号
eth.coinbase 默认为第一个账户

修改矿工账号
miner.setEtherbase(eth.accounts[1])

查看账户信息
eth.accounts[0]

查看账户余额
eth.getBalance(eth.accounts[0])
或者 web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")

解锁账号
personal.unlockAccount(eth.accounts[0])
使用账户资金前都需要先解锁账号

转账eth.sendTransaction({from:eth.accounts[0],to:"0x587e57a516730381958f86703b1f8e970ff445d9",value:web3.toWei(3,"ether")})
使用 txpool.status 可以看到交易状态

查看区块数据
eth.blockNumber
eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825")
eth.getBlock(1) 通过区块号查看区块

三、智能合约

3.1 编辑合约代码

创建一个 Token.sol 文件,内容如下:

contract Token {
    address issuer;
    mapping (address => uint) balances;

    event Issue(address account, uint amount);
    event Transfer(address from, address to, uint amount);

    function Token() {
        issuer = msg.sender;
    }

    function issue(address account, uint amount) {
        if (msg.sender != issuer) throw;
        balances[account] += amount;
    }

    function transfer(address to, uint amount) {
        if (balances[msg.sender] < amount) throw;

        balances[msg.sender] -= amount;
        balances[to] += amount;

        Transfer(msg.sender, to, amount);
    }

    function getBalance(address account) constant returns (uint) {
        return balances[account];
    }
}

这份代码实现了一个简单的Token合约功能。
issue 函数可以向充值以太到合约账户
transfer 函数可以向其他账号发送token
getBalance 函数可以获取某个账号的token余额

3.2 编译与部署

压缩合约代码
命令行下执行 cat Token.sol | tr '\n' ' '
这条命令将代码中的换行符替换成空格,这样我们的代码就只有一行了。命令执行成功后将回显复制下来。

将合约代码保存为一个变量
回到Geth JavaScript 控制台,执行如下命令,等于号后面的内容就是我们刚才复制下来的压缩后的合约代码。

var tokenSource = 'contract Token { address issuer; mapping (address => uint) balances; event Issue(address account, uint amount); event Transfer(address from, address to, uint amount); function Token() { issuer = msg.sender; } function issue(address account, uint amount) { if (msg.sender != issuer) throw; balances[account] += amount; } function transfer(address to, uint amount) { if (balances[msg.sender] < amount) throw; balances[msg.sender] -= amount; balances[to] += amount; Transfer(msg.sender, to, amount); } function getBalance(address account) constant returns (uint) { return balances[account]; } }';

编译
var tokenCompiled = eth.compile.solidity(tokenSource);

若不成功,请参考https://ethereum.stackexchange.com/questions/15435/how-to-compile-solidity-contracts-with-geth-v1-6提供的替代方案

查看二进制代码
tokenCompiled['<stdin>:Token'].code

查看ABI
tokenCompiled['<stdin>:Token'].info.abiDefinition

创建合约对象
var contract = eth.contract(tokenCompiled['<stdin>:Token'].info.abiDefinition);
var initializer = {from: web3.eth.accounts[0], data: tokenCompiled['<stdin>:Token'].code, gas: 300000};
var token = contract.new(initializer)

输入命令 token 可以看到此时的token有transactionHash 但是没有address
执行 miner.start(1) 一段时间后停止,我们的合约就发布到了链上

3.3 与合约进行交互

充值

personal.unlockAccount(eth.accounts[0])
token.issue.sendTransaction(eth.accounts[0], 100, {from: eth.accounts[0]});
miner.start(1)
miner.stop()

发送 token

token.transfer(eth.accounts[1], 30, {from: eth.accounts[0]})
miner.start(1)
miner.stop()

查看余额

token.getBalance()

命令用法

geth [选项] 命令 [命令选项] [参数…]

版本:

1.7.3-stable

命令:

account    管理账户

attach    启动交互式JavaScript环境(连接到节点)

bug        上报bug Issues

console    启动交互式JavaScript环境

copydb    从文件夹创建本地链

dump      Dump(分析)一个特定的块存储

dumpconfig 显示配置值

export    导出区块链到文件

import    导入一个区块链文件

init      启动并初始化一个新的创世纪块

js        执行指定的JavaScript文件(多个)

license    显示许可信息

makecache  生成ethash验证缓存(用于测试)

makedag    生成ethash 挖矿DAG(用于测试)

monitor    监控和可视化节点指标

removedb  删除区块链和状态数据库

version    打印版本号

wallet    管理Ethereum预售钱包

help,h    显示一个命令或帮助一个命令列表

ETHEREUM选项:

--config value          TOML 配置文件

--datadir “xxx”        数据库和keystore密钥的数据目录

--keystore              keystore存放目录(默认在datadir内)

--nousb                禁用监控和管理USB硬件钱包

--networkid value      网络标识符(整型, 1=Frontier, 2=Morden (弃用), 3=Ropsten, 4=Rinkeby) (默认: 1)

--testnet              Ropsten网络:预先配置的POW(proof-of-work)测试网络

--rinkeby              Rinkeby网络: 预先配置的POA(proof-of-authority)测试网络

--syncmode "fast"      同步模式 ("fast", "full", or "light")

--ethstats value        上报ethstats service  URL (nodename:secret@host:port)

--identity value        自定义节点名

--lightserv value      允许LES请求时间最大百分比(0 – 90)(默认值:0)

--lightpeers value      最大LES client peers数量(默认值:20)

--lightkdf              在KDF强度消费时降低key-derivation RAM&CPU使用

开发者(模式)选项:

--dev              使用POA共识网络,默认预分配一个开发者账户并且会自动开启挖矿。

--dev.period value  开发者模式下挖矿周期 (0 = 仅在交易时) (默认: 0)

ETHASH 选项:

--ethash.cachedir                        ethash验证缓存目录(默认 = datadir目录内)

--ethash.cachesinmem value              在内存保存的最近的ethash缓存个数  (每个缓存16MB ) (默认: 2)

--ethash.cachesondisk value              在磁盘保存的最近的ethash缓存个数 (每个缓存16MB) (默认: 3)

--ethash.dagdir ""                      存ethash DAGs目录 (默认 = 用户hom目录)

--ethash.dagsinmem value                在内存保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 1)

--ethash.dagsondisk value                在磁盘保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 2)

交易池选项:

--txpool.nolocals            为本地提交交易禁用价格豁免

--txpool.journal value      本地交易的磁盘日志:用于节点重启 (默认: "transactions.rlp")

--txpool.rejournal value    重新生成本地交易日志的时间间隔 (默认: 1小时)

--txpool.pricelimit value    加入交易池的最小的gas价格限制(默认: 1)

--txpool.pricebump value    价格波动百分比(相对之前已有交易) (默认: 10)

--txpool.accountslots value  每个帐户保证可执行的最少交易槽数量  (默认: 16)

--txpool.globalslots value  所有帐户可执行的最大交易槽数量 (默认: 4096)

--txpool.accountqueue value  每个帐户允许的最多非可执行交易槽数量 (默认: 64)

--txpool.globalqueue value  所有帐户非可执行交易最大槽数量  (默认: 1024)

--txpool.lifetime value      非可执行交易最大入队时间(默认: 3小时)

性能调优的选项:

--cache value                分配给内部缓存的内存MB数量,缓存值(最低16 mb /数据库强制要求)(默认:128)

--trie-cache-gens value      保持在内存中产生的trie node数量(默认:120)

帐户选项:

--unlock value              需解锁账户用逗号分隔

--password value            用于非交互式密码输入的密码文件

API和控制台选项:

--rpc                      启用HTTP-RPC服务器

--rpcaddr value            HTTP-RPC服务器接口地址(默认值:“localhost”)

--rpcport value            HTTP-RPC服务器监听端口(默认值:8545)

--rpcapi value              基于HTTP-RPC接口提供的API

--ws                        启用WS-RPC服务器

--wsaddr value              WS-RPC服务器监听接口地址(默认值:“localhost”)

--wsport value              WS-RPC服务器监听端口(默认值:8546)

--wsapi  value              基于WS-RPC的接口提供的API

--wsorigins value          websockets请求允许的源

--ipcdisable                禁用IPC-RPC服务器

--ipcpath                  包含在datadir里的IPC socket/pipe文件名(转义过的显式路径)

--rpccorsdomain value      允许跨域请求的域名列表(逗号分隔)(浏览器强制)

--jspath loadScript        JavaScript加载脚本的根路径(默认值:“.”)

--exec value                执行JavaScript语句(只能结合console/attach使用)

--preload value            预加载到控制台的JavaScript文件列表(逗号分隔)

网络选项:

--bootnodes value    用于P2P发现引导的enode urls(逗号分隔)(对于light servers用v4+v5代替)

--bootnodesv4 value  用于P2P v4发现引导的enode urls(逗号分隔) (light server, 全节点)

--bootnodesv5 value  用于P2P v5发现引导的enode urls(逗号分隔) (light server, 轻节点)

--port value        网卡监听端口(默认值:30303)

--maxpeers value    最大的网络节点数量(如果设置为0,网络将被禁用)(默认值:25)

--maxpendpeers value    最大尝试连接的数量(如果设置为0,则将使用默认值)(默认值:0)

--nat value            NAT端口映射机制 (any|none|upnp|pmp|extip:) (默认: “any”)

--nodiscover            禁用节点发现机制(手动添加节点)

--v5disc                启用实验性的RLPx V5(Topic发现)机制

--nodekey value        P2P节点密钥文件

--nodekeyhex value      十六进制的P2P节点密钥(用于测试)

矿工选项:

--mine                  打开挖矿

--minerthreads value    挖矿使用的CPU线程数量(默认值:8)

--etherbase value      挖矿奖励地址(默认=第一个创建的帐户)(默认值:“0”)

--targetgaslimit value  目标gas限制:设置最低gas限制(低于这个不会被挖?) (默认值:“4712388”)

--gasprice value        挖矿接受交易的最低gas价格

--extradata value      矿工设置的额外块数据(默认=client version)

GAS价格选项:

--gpoblocks value      用于检查gas价格的最近块的个数  (默认: 10)

--gpopercentile value  建议gas价参考最近交易的gas价的百分位数,(默认: 50)

虚拟机的选项:

--vmdebug        记录VM及合约调试信息

日志和调试选项:

--metrics            启用metrics收集和报告

--fakepow            禁用proof-of-work验证

--verbosity value    日志详细度:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)

--vmodule value      每个模块详细度:以 =的逗号分隔列表 (比如 eth/*=6,p2p=5)

--backtrace value    请求特定日志记录堆栈跟踪 (比如 “block.go:271”)

--debug                    突出显示调用位置日志(文件名及行号)

--pprof                    启用pprof HTTP服务器

--pprofaddr value          pprof HTTP服务器监听接口(默认值:127.0.0.1)

--pprofport value          pprof HTTP服务器监听端口(默认值:6060)

--memprofilerate value      按指定频率打开memory profiling    (默认:524288)

--blockprofilerate value    按指定频率打开block profiling    (默认值:0)

--cpuprofile value          将CPU profile写入指定文件

--trace value              将execution trace写入指定文件

WHISPER实验选项:

--shh                        启用Whisper

--shh.maxmessagesize value  可接受的最大的消息大小 (默认值: 1048576)

--shh.pow value              可接受的最小的POW (默认值: 0.2)

弃用选项:

--fast    开启快速同步

--light    启用轻客户端模式

其他选项:

–help, -h    显示帮助


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值