以太坊私有链搭建

0x01 Ubuntu环境下的以太坊安装

一. 基本环境配置:

1. 命令行安装
打开终端依次输入以下命令
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install Ethereum

2.源码编译Ubuntu和Mac下编译
cd go-ethereum
make geth   或者 make all
配置环境变量
将 geth 添加到环境变量中
# ubuntu下
vim ~/.bashrc
# 打开配置文件后,把以下内容添加到文件中
exportGETH="$GOPATH. c/http://github.com/ethereum/go-ethereum/build"
exportPATH="$PATH:$GETH/bin"
然后执行,使配置生效。
source ~/.bashrc
export GETH="$GOPATH/home/(具体地址)"
export PATH="$PATH:$GETH/bin"
3.安装完成后,输入geth -h,如果有列出信息则说明安装成功,可查看列出信息,方便后续的操作

 

二.安装geth

1.Geth安装好:

 

 

2. 创建新的账户

 

 

3. 编辑genesis.json文件:

 

 

4. 编辑好以后,

在终端输入【geth --datadir data --networkid 20140628 --rpc --rpccorsdomain "*" init ./genesis.json】

需要说明的是,

--networkid 20140628,为私链id,可以任意修改为自己的id,以太坊主网id为1,后续要搭建私链下的其他节点,networkid必须相同

--datadir data 中data是文件夹的名称,私链数据会存储在这个文件夹内,当要在同一计算机中创建其他私链节点时,可创建另外的文件夹,例如data2,然后通过--datadir data2区分不同的私链节点,如果未设置--datadir,则会读取以太坊主网的数据,默认位置在/root/.ethereum中。

5. 开启geth私链客户端:

geth --datadir data --networkid 20140628 --rpc --rpccorsdomain "*" --nodiscover --port 16333 --rpcport 8546 console

如果启用第二个测试节点,port以及rpcport应与第一个节点不同

 

 

6. 接下来是一气呵成

 

 

7. 停止挖矿

 
 

8. 创建一个新的账户挖一下

personal.account(“3zzz”)#创建了一个密码为3zzz的账户,这里请记住给的账户地址

eth.getBalnce(“ ”)#中间放刚刚的账户地址

miner.Etherbase(“ ”)#准备挖矿

miner.start(1)#开始挖矿,线程为1;

----

出现了可爱的小榔头,挖矿成功

----

看一下我们的收益:

 

9.  转账

(网站说以太坊默认挖矿是放在第一个账户,我不是特别赞同,毕竟我的第二个账户有矿)

web3.fromWei(web3.eth.getBalance(web3.eth.accounts[0]),"ether")#查询0号账户

web3.fromWei(web3.eth.getBalance(web3.eth.accounts[1]),"ether")#查询1号账户

 

 

【备注:eth单位】

kwei (1000 Wei)

mwei (1000 KWei)

gwei (1000 mwei)

szabo (1000 gwei)

finney (1000 szabo)

ether (1000 finney)

ether =wei * 10^18

wei转ether:

    > web3.fromWei(10000000000000000,"ether")

    "0.01"

ether转wei:”

    > web3.toWei(1)

    "1000000000000000000"

 

9.2. 第2个账户转账给第3个账户

web3.eth.sendTransaction({from:web3.eth.accounts[1] , to: web3.eth.accounts[2],value: web3.toWei(1, "ether")})

 

 

保存进度:

需要输入密码,我的3zzz不行,加了密的文档不行。。我不行了。。。

https://blog.csdn.net/w88193363/article/details/79402074

personal.unlockAccount(web3.eth.accounts[0])#正确应该提示true

 

 

 

0x02. Windows平台下以太坊私有链搭建及钱包部署和运行

一、安装环境准备

1、安装Ethereum-Wallet

(1)在D盘新建文件夹Eth,专门放置以太坊开发环境

(2)把下载的Ethereum-Wallet-win64-0-8-10.zip压缩包win-unpacked解压到D:\Eth目录下

2、安装geth

(1)geth下载:https://ethereum.github.io/go-ethereum/downloads/

(2)安装geth,安装在D:\Eth 目录下

(3)在D:\Eth目录下创建privatechain文件,用以存放区块链数据。

 

二、以太坊私有链搭建

1、创建第一个节点

 (1)在D:\Eth 目录下创建创世块文件genesis.json,文件内容如下:

{

  "nonce": "0x0000000000000042",

  "difficulty": "0x40000",

  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",

  "coinbase": "0x0000000000000000000000000000000000000000",

  "timestamp": "0x00",

  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",

  "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",

  "gasLimit": "0xffffffff",

  "alloc": {

    "3282791d6fd713f1e94f4bfd565eaa78b3a0599d": {

      "balance": "1337000000000000000000"

    },

    "17961d633bcf20a7b029a7d94b7df4da2ec5427f": {

      "balance": "229427000000000000000"

    }

  },

  "config": {

        "chainId": 15,

        "homesteadBlock": 0,

        "eip155Block": 0,

        "eip158Block": 0

    }

}

Coinbase: 旷工账户

Difficulty: 挖矿难度,0x400,这个是简单。

extraData:相当于备注

gasLimit:最小消耗gas

nonce : 64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊黄皮书中的要求

parentHash : 上一个区块的Hash值,因为是创世块,石头里蹦出来的,没有在它前面的,所以是0

Timestamp : 时间戳

 

(2)打开cmd,进入D:\Eth 目录下(该目录下有geth.exe和genesis.json文件,便于运行geth命令),创世块文件初始化命令如下:

geth -datadir "%cd%\privatechain\node1" init genesis.json

 

--datadir:后面跟本节点数据存放的目录。

genesis.json:是init命令的参数。

执行该命令后会在D:\Eth\privatechain下自动新建node1文件夹,并在node1下生成geth和keystore两个文件夹。其中geth存放的是区块信息,keystore中存放的是账户信息。

初始化完成以后你就拥有一条自己的私有链了,之后就可以启动自己的私有链进行一些操作。

 

 

 

(3)启动私有链节点:geth --targetgaslimit 4294967295 --rpc --rpcport "8101" --port "30301" --rpcapi "eth,web3,personal" --networkid 2020 --identity 2020 --nodiscover --maxpeers 5 --datadir "%cd%\privatechain\node1" --unlock 0 --rpccorsdomain "*" console

注释:

 --targetgaslimit:每个块的gas上限,这里可以暂时理解为容量

--rpc:启动rpc通信,可以进行智能合约的部署和调试

--rpcaddr:rpc接口的地址

--rpcport:rpc接口的端口号

--port:网络监听端口,用于节点之间通信

--rpcapi:设置rpc的范围,暂时开启eth,web3,personal足够

--networkid:设置当前区块链的网络ID,是一个数字,可以随便写

--identity:区块链的标示,随便填写,用于标示目前网络的名字

--nodiscover:禁止被网络中其它节点发现,需要手动添加该节点到网络

--maxpeers:最大节点数量

--datadir:设置当前区块链网络数据存放的位置

--unlock:解锁某用户(此处用用户坐标来控制,解锁后的用户调用接口发起交易时,不要需要提供密码),0代表存储在账号数组中的第一个账号,如果一开始没有创建账号,改参数可以去掉,不然会报错,找不到该账号。

--rpccorsdomain:限制rpc访问源的ip,代表不限制

--mine:允许挖矿

--console:启动命令行模式,可以在Geth中执行命令*

172.25.240.22:要改为自己的IP

 

 

该命令的主体是geth consoal,表示启动该节点并进入交互控制台。其中--networkid 2020 表示私有链的网络id。网络id在连接到其他接点时也会用到。以太坊公网的id是1,为了不产生冲突,这里要指定自己的网络id。

 

如果解除锁定以后还是错的,跟着网上教程:

 

 

https://blog.csdn.net/luhuiwan1314/article/details/79623998

但是:这样启动后,如果挖不了矿,就回到启动节点那一步,第一次没有创建用户还是要记得解除锁定,一般情况下都打得开。

 

【注意】

如果之前创建了用户,在启动过程中会提示输入密码:XXXXXX(即之前创建的账号)

运行成功后,就启动了区块链节点并进入了Javascript Console。

 

 

 

【我在Windows10虚拟机上重新搭建的】

这是一个交互式的Javascript执行环境,在这里面可以执行Javascript代码,其中>是命令提示符。在这个环境里也内置了一些用来操作以太坊的Javascript对象,可以直接使用这些对象。这些对象主要包括:eth、net、admin、miner、personal、txpool、web3这几个模块。

如果带参数--mine启动,耐心等一会时间!!!自动显示挖矿,挖矿一会时间(如果不带--mine参数启动则不会挖矿)

停止挖矿命令:miner.stop(),不要在意输出的刷屏,只管输入完成后回车即可,如果输入正确,回车后会输出“true”。(其实这里建议启动一个CPU挖矿:miner.start(1) ,以后交易需要矿工确认,在这里挖了坑…)

挖矿命令:miner.start(1)

miner命令括号中的1表示用一个线程进行挖矿,如果不配置,就会让CPU全速运行,影响计算机的使用。

1.创建账户:

 

此时为0个;

2.输入密码创建账号

 

再次发现,果然存在

 

 3.Miner.start()

第一次会初始化:

 

初始化到100 【以后注意,如果数字有顺序,可能是初始化,不要不小心暂停了】

 

三、支持的操作指令

1) 查询钱包余额指令:eth.getBalance(eth.accounts[0]),查询的是第一个账户的余额,当我们挖矿时,奖励金存储默认的是第一个账户

2)转账指令: eth.sendTransaction({from:"第一个账户的账号",to:"第二个账户的账号",value:web3.toWei(1000000,"ether")})

当直接执行此方法时会抛出异常:

account is locked

    at web3.js:3119:20

    at web3.js:6023:15

    at web3.js:4995:36

    at <anonymous>:1:1

 【原因】

账号被锁住

【解锁指令】

personal.unlockAccount("第一个账户的账号","设定的密码")

3)创建账号

personal.newAccount()

4)查看账号

eth.accounts

5)查看账号余额

eth.getBalance(eth.accounts[0])

6)启动&停止挖矿

启动挖矿:
miner.start(1)

其中 start 的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢,等进度达到 100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。

停止挖矿,在 console 中输入:
miner.stop()
挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户,可以通过 miner.setEtherbase() 将其他账户设置成 coinbase。

7)转账

目前,账户 0 已经挖到了 3 个块的奖励,账户 1 的余额还是0:

eth.getBalance(eth.accounts[0])
15000000000000000000
eth.getBalance(eth.accounts[1])
0


我们要从账户 0 向账户 1 转账,所以要先解锁账户 0,才能发起交易:

personal.unlockAccount(eth.accounts[0])
Unlock account 0x3443ffb2a5ce3f4b80080791e0fde16a3fac2802
Passphrase:
true

 

发送交易,账户 0 -> 账户 1:
amount = web3.toWei(5,'ether')
"5000000000000000000"
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

需要输入密码 123456

 INFO[09-12|07:38:12]Submitted transaction fullhash=0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce recipient=0x02bee2a1582bbf58c42bbdfe7b8db4685d4d4c62

"0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce"

 

此时如果没有挖矿,用 txpool.status 命令可以看到本地交易池中有一个待确认的交易,可以使用 eth.getBlock("pending", true).transactions 查看当前待确认交易。

 

 

使用 miner.start() 命令开始挖矿:
miner.start(1);admin.sleepBlocks(1);miner.stop();

新区块挖出后,挖矿结束,查看账户 1 的余额,已经收到了账户 0 的以太币:

web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')

 

最后两步我没走,因为点错了终端就卡机了,然后重启,发现账户2(1a)已经收到转账了

0x03 安装智能合约

前提:将geth.exe拷到Unpacked文件夹,然后点击该文件夹里的wallet.exe,关闭提示更新的窗口

测试一下钱包页面:

  1. 添加账号

 

 

 

提示钥匙文件的储存位置:

 

 

2.转账:

地址是点击账户复制的

 

 

转账以后要打开geth命令行页面,开始挖矿才会转账成功

 

 3.部署智能合约

 

 

但是方框中的代码我不知道如何填,那天忘记记录了。旁边的选项第一次试验有(可能是复制了其他代码显示的),现在没有了。第一次的智能合约是deploy成功了的。

接下来打开geth页面挖矿,会显示我刚刚的2wei币:

 

 

 4.运行智能合约

 

 

*我这里刚开始报错:

No visibility specified. Defaulting to "public".

    function MyToken(uint256 _supply, string _name,string _symbol, uint8 _decimals){

^

Spanning multiple lines.

解决方法:

 

因为前面是public

https://stackoverflow.com/questions/47959564/no-visibility-specified-defaulting-to-public-function-transferaddress-recei

将所有function transfer()external {}

*第二个报错:

 

 

这里是“throw”废弃了,然后我使用的require(balanceOF…..)

然后这边修改好以后,上面加external的地方又报错,然后就去搜资料,有新的智能合约代码,我试了一下貌似是对的:

pragma solidity ^0.4.18;//版本一定对得上号。0.4.18不能错!

contract Token {

  mapping (address => uint) public balancesOf;

  address public owner;

  function Token() public {

    owner = msg.sender;

    balancesOf[msg.sender] = 10000;

  }

 

  function transfer (address _to, uint _value) public {

    require (balancesOf[msg.sender] > _value);  //避免转移出去的代币超过当前的存货

    require (balancesOf[_to] + _value > balancesOf[_to]);  //避免自己调用自己,或者递归调用

    balancesOf[msg.sender] -= _value;

    balancesOf[_to] += _value;

  }

 

  function mint(uint _amount) public {

    balancesOf[owner] += _amount;

  }

}

但是我这里只有一个选项:

 

不管了,deploy一下:

 

 

最后geth页面挖矿(真正激活合约)

5.调用智能合约

进入页面,这里有我们刚刚部署且运行过的智能合约了,第二个就是我们刚刚第四步从main账户创建的智能合约。

 

 

点击第二个账户,测试一下其功能:

 

 

选择一个转账吧:

 

 

还是老样子,转账金额选择à输入转款地址的密码à挖矿;

??我的钱呢??

 

 

这里是跑进了第二个账户,而不是智能合约的第二个账户

 

 

我的理解是智能合约是一种协议,目的是为了可信交易,主要是验证身份,所以智能合约是不是不做存钱功能。

 

 

这里的交易记录也可以看到,确实是转过给第二个智能合约

posted @ 2020-12-18 18:02  这醋好甜  阅读(885)  评论(0编辑  收藏  举报