以太坊私有链搭建 0x01 Ubuntu环境下的以太坊安装 0x02. Windows平台下以太坊私有链搭建及钱包部署和运行 0x03 安装智能合约

一. 基本环境配置:

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,如果有列出信息则说明安装成功,可查看列出信息,方便后续的操作

以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

二.安装geth

1.Geth安装好:

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

2. 创建新的账户

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

3. 编辑genesis.json文件:

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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应与第一个节点不同

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

6. 接下来是一气呵成

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

7. 停止挖矿

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约
 

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

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

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

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

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

----

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

----

看一下我们的收益:

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

9.  转账

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

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

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

【备注: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")})

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

保存进度:

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

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

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

 

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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文件,用以存放区块链数据。

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

二、以太坊私有链搭建

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 ode1" init genesis.json

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

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

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

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

(3)启动私有链节点:geth --targetgaslimit 4294967295 --rpc --rpcport "8101" --port "30301" --rpcapi "eth,web3,personal" --networkid 2020 --identity 2020 --nodiscover --maxpeers 5 --datadir "%cd%privatechain ode1" --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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

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

【注意】

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

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

【我在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.创建账户:

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

此时为0个;

2.输入密码创建账号

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

再次发现,果然存在

以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

 3.Miner.start()

第一次会初始化:

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

初始化到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

以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约


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

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

发送交易,账户 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"

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

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

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

0x03 安装智能合约

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

测试一下钱包页面:

  1. 添加账号

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

2.转账:

地址是点击账户复制的

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

 3.部署智能合约

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

 4.运行智能合约

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

*我这里刚开始报错:

No visibility specified. Defaulting to "public".

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

^

Spanning multiple lines.

解决方法:

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

因为前面是public

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

将所有function transfer()external {}

*第二个报错:

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

这里是“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;

  }

}

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

不管了,deploy一下:

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

5.调用智能合约

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

选择一个转账吧:

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

??我的钱呢??

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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

 以太坊私有链搭建
0x01 Ubuntu环境下的以太坊安装
0x02. Windows平台下以太坊私有链搭建及钱包部署和运行
0x03 安装智能合约

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