以太坊本地开发环境以及智能合约

首先安装go环境 https://golang.org/dl/ 直接用安装包安装。
完成后看下
go env
然后关注下gopath路径,
GOPATH="/Users/MacPro/box/
我们要把go版客户端放这里,go编译器执行都是去设定好的目录执行。以后写go的时候项目也要放这里。

下载go版以太坊客户端
git clone https://github.com/ethereum/go-ethereum
cd go-ethereum
make geth
编译成功以后开始以太坊本地测试
先用命令看下,是否成功,
build/bin/geth -h

如果直接用geth 需要做下环境变量
export PATH=$PATH:/全路径/build/bin/geth

开始搭建私有测试链
1 找一个目录存放挖矿数据 /home/vagrant/
2 创建创世块配置文件
vim genesis.json

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

3 初始化配置
geth --datadir data init genesis.json

4 启动节点
geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console
各参数代表的含义如下:
networkid 设置当前区块链的网络ID,用于区分不同的网络,1表示公链
rpc 表示启动rpc通信,可以进行智能合约的部署和调试
console 表示启动命令行模式,可以在Geth中执行命令
执行成功后将进入区块链的JavaScript控制台环境

5 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:eth.accounts[1],value:web3.toWei(3,"ether")})
使用txpool.status可以看到交易状态

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

可以开一个窗口挖矿,再开一个窗口做交易。
build/bin/geth attach ipc:/Users/MacPro/go_project/src/github.com/ethereum/go-ethereum/data/geth.ipc

6 智能合约
创建一个solidity 编写的 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 函数可以向账户直接存放token
transfer 函数可以向其他账号发送token
getBalance 函数可以获取某个账号的token余额
从这个合约就能了解到,erc20协议就是在以太坊上存一个数字,然后加减所谓交易,其他的其实也做不了更多。
7部署合约
先到http://remix.ethereum.org/上编译测试合约,会生成一个web3格式的部署代码

以太坊本地开发环境以及智能合约_第1张图片

先解锁 personal.unlockAccount(eth.accounts[0])
点击details 左边WEB3DEPLOY下代码复制到geth窗口
然后贴代码回车

成功以后 执行 token 看下abi数据
开始执行合约方法
此时挖矿程序要一直工作

>token.issue(eth.accounts[0],30,{from: eth.accounts[0]})
"0xae0fafd672cfcbaf3bf717a2dee49db3017d4da87cb3e087f2b3e2f28f933cf7"
>token.getBalance(eth.accounts[0])
100
> token.transfer(eth.accounts[1], 30, {from: eth.accounts[0]})
"0x0df5fb59e8c96cb0884db40163f50fba9d65ad6e03080c21ba7d9fc2ca9663f0"
> token.getBalance(eth.accounts[1])
30

参考文章
以太坊私链与智能合约部署入门教程
以太坊之部署智能合约

你可能感兴趣的:(以太坊本地开发环境以及智能合约)