以太坊私有链的搭建及简单智能合约的部署

开发环境:Linux

 

目录

环境配置

安装git

安装geth

安装solc

私有节点的创建

创世区块的构建

初始化创世区块

启动节点

创建用户进行挖矿

智能合约的编写和部署

简单智能合约的编写

在Remix上debug智能合约

solc获取合约相关信息

合约的部署



环境配置

安装git

之后的安装需要用到git,在终端下输入以下命令安装git

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

上述过程完成后输入 git --version 返回版本号即可确认安装完成。


安装geth

终端中输入以下命令

sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

上述过程完成,输入 geth --help 返回geth的用法,即确认安装完成。


安装solc

终端输入

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc

上述过程完成后输入 solc --version 返回版本号即可确认安装完成。


私有节点的创建

创世区块的构建

编辑好一个名为genesis.json的创世区块文件以定义私有链的信息

{
  "config": {
        "chainId": 666,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x00000001",
  "extraData"  : "",
  "gasLimit"   : "0xffffff",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

各字段的含义如下:

config

私链的相关配置,这里用来设置chainId等的值,其中chainId不能为0

alloc

用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以这里不需要预置有币的账号,需要的时候创建即可以。

coinbase

矿工账号

difficulty

当前区块额难度,设为1,使得私链挖矿简单点。

extraData

附加信息

gasLimit

当前区块能够消耗的最大的总gas值

nonce

nonce是一个随机数,用于挖矿

mixhash

与nonce配合用于挖矿,由上一个区块的一部分生成的hash。和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。

parentHash

上一个区块的hash值,因为这里是创世区块,所以parentHash为0

timestamp

设置创世区块的时间戳,从0开始


初始化创世区块

geth --datadir data init genesis.json

上述命令的字段含义如下:

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

启动节点

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

上述命令各字段的含义如下:

字段 含义
identity 区块链的标示,随便填写,用于标示目前网络的名字
port 网络监听端口
rpc 启动rpc通信,可以进行智能合约的部署和调试
rpcapi 设置允许连接的rpc的客户端,一般为db,eth,net,web3,默认情况下,Geth允许web3
networkid 设置当前区块链的网络ID,用于区分不同的网络,是一个数字
console 启动命令行模式,可以在Geth中执行命令
rpccorsdomain 设置请求ip白名单 * 为所有
nodiscover 使用这个参数,你的节点就不会被其他人发现,除非手动添加你的节点。否则,就只有一个被无意添加到一个陌生区块链上的机会,那就是跟你有相同的genesis文件和networkID。

可以使用把输出日志输出到文件里,下面命令表示把输出日志输出到detail.log文件里,其中 --verbosity 4 表示输出的日志详细程度,可以省略

geth --datadir data --verbosity 4 console 2>>detail.log

如果不想把日志输出到文件内,也可以直接使用命令 geth --datadir data console,此时 日志将在终端输出


创建用户进行挖矿

1、创建新用户

> personal.newAccount()
Passphrase: 
Repeat passphrase: 
"0xf45fd17e0535d97ab291b91ee3f675d403ca5efb"

Passphrase: 
Repeat passphrase: 
两段后输入的是此用户的密码(随意)
"0xf45fd17e0535d97ab291b91ee3f675d403ca5efb"为用户的哈希地址,之后要用到。

也可以直接使用命令 personal.newAccount("xxx") 来直接初始化用户的密码

2、查看用户余额

> myAddress = "0xf45fd17e0535d97ab291b91ee3f675d403ca5efb"
"0xf45fd17e0535d97ab291b91ee3f675d403ca5efb"
> eth.getBalance(myAddress)
0

3、进行挖矿赚取工钱以满足后续部署智能合约需要

miner.start();admin.sleepBlocks(1);miner.stop()

上面命令意思是当成功挖到一个矿就停止挖矿。


智能合约的编写和部署

简单智能合约的编写

编写一个简单的智能合约,以下为求两个数的和。

pragma solidity ^0.4.7;

contract test3 {
   
    uint x;
    uint y;
    
    function set(uint _x, uint _y) public {
        x = _x;
        y = _y;
    }
    
    function getAdd() public view returns(uint) {
        return x + y;
    }
}

在Remix上debug智能合约

在这不一一列举,可以转至Remix用法查看。


solc获取合约相关信息

打开另一个终端进入合约文件保存目录,输入以下命令

$ solc --bin test.sol

======= test.sol:test3 =======
Binary: 
608060405234801561001057600080fd5b5060f68061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631ab06ee514604e578063d14d42ba146082575b600080fd5b348015605957600080fd5b506080600480360381019080803590602001909291908035906020019092919050505060aa565b005b348015608d57600080fd5b50609460bc565b6040518082815260200191505060405180910390f35b81600081905550806001819055505050565b6000600154600054019050905600a165627a7a72305820f923c2e4a50417a6f982efc6cf547f573d8b80be1bbe394bb0f4aaa5dd42ae1e0029
$ solc --abi test.sol

======= test.sol:test3 =======
Contract JSON ABI 
[{"constant":false,"inputs":[{"name":"_x","type":"uint256"},{"name":"_y","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAdd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

合约的部署

1、在geth命令行下定义变量 code 和 abi 来保存上面solc获取到的合约信息,其中 code = “0x***,0x表示十六进制,0x后面接的是solc --bin test.sol 返回的十六进制串。abi = solc --abi test.sol 命令返回的 json 串。

2、解锁当前用户:

personal.unlockAccount(myAddress)

3、发送部署合约的交易:

myContract = eth.contract(abi)
contract = myContract.new({from: myAddress, data: code, gas: 1000000})

4、查询交易池的状态:

txpool.status

此时返回一个json文件,里面的pending的值为1,表示当前还有一个交易待确认。

5、挖矿确认上述交易:

miner.start();admin.sleepBlocks(1);miner.stop()

此时再查看交易池的状态,发现pending的值为0,表示当前没有交易待确认。

6、在私链上调用智能合约

contract.set.sendTransaction(4, 5, {from:myAddress})

以上set为合约的函数,senTransaction函数里的参数前面的数合约的函数的输入参数,最后一个参数为用户地址,表示该交易由其发起。调用上述函数后庙会返回一串哈希值,为交易的哈希值,可以通过使用命令:eth.getTransaction(交易哈希地址)来获取这笔交易的相关信息。

contract.getAdd.sendTransaction({from:myAddress})

以上调用合约的getAdd函数。


谢谢阅读。

参考资料

  1. https://www.linuxidc.com/Linux/2017-11/148479.htm
  2. https://juejin.im/post/5b07f61af265da0ddf04a1c2

 

你可能感兴趣的:(区块链)