以太坊私有链搭建
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,关闭提示更新的窗口
测试一下钱包页面:
- 添加账号
提示钥匙文件的储存位置:
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
将所有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账户创建的智能合约。
点击第二个账户,测试一下其功能:
选择一个转账吧:
还是老样子,转账金额选择à输入转款地址的密码à挖矿;
??我的钱呢??
这里是跑进了第二个账户,而不是智能合约的第二个账户
我的理解是智能合约是一种协议,目的是为了可信交易,主要是验证身份,所以智能合约是不是不做存钱功能。
这里的交易记录也可以看到,确实是转过给第二个智能合约