以太坊通过The Merge转变为PoS权益证明,所以这里选用了一个较早的版本geth1.9,此版本支持PoW工作量证明。
什么是区块链呢?
区块链是一种基于密码学原理的分布式账本技术,其核心是将数据打包成按时间顺序连接的“区块”,并通过去中心化的网络节点共同维护和验证。每个新区块包含前一个区块的哈希值,形成不可篡改的链式结构;节点之间通过共识机制(如工作量证明或权益证明)确保数据一致性,无需依赖中心化机构即可实现安全、透明、可追溯的数据管理。
OK,简单说下原理,下面是实现。
私有链实现
虚拟机和网络的配置
这里我准备了两台Ubuntu的虚拟机
这里我的虚拟机网络配置都为仅主机模式,同时虚拟机中取消用dhcp自动配置ip,而选用ipv4手动设置为192.168.23.121和192.168.23.122,网关和子网掩码都为192.168.23.0和255.255.255.0
这样可以将两台虚拟机放入同一网段下实现联通
Ubuntu1配置:

Ubuntu2配置:

查看连通性,能ping通就ok
下载geth1.9版本
然后再两台虚拟机分别下载geth(这里我用的二进制文件,注意下载前先cd进一个创建好的文件夹,方便后续操作 eg:mkdir ~/install)

wget https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-amd64-1.9.10-58cf5686.tar.gz
解压:
tar zxvf geth-alltools-linux-amd64-1.9.10-58cf5686.tar.gz
将可执行文件移动到geth-home下(没有记得mkdir创建:mkdir -p ~/geth-home)
mv geth-alltools-linux-amd64-1.9.10-58cf5686 ~/geth-home
将 ~/geth-home 添加到系统的 PATH 环境变量中
export PATH=$HOME/geth-home:$PATH
将上面的环境变量设置写入 ~/.bashrc 文件中
echo `export PATH=$HOME/geth-home:$PATH` >> ~/.bashrc
上述步骤完成好之后geth verison查看下版本

出现上述结果就ok啦(注意两台虚拟机记得都要配置)
编写创世区块
然后我们来编写创世区块文件
vi genesis.json

创世区块内容:
{
"config": {
"chainId": 18,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x2",
"extraData" : "",
"gasLimit" : "0xffffffff",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
两台虚拟机的创世区块文件一样,不用做修改
初始化和启动geth
wq!保存退出后初始化
geth init genesis.json --datadir ./data

初始化成功后启动geth,注意这里两台虚拟机的操作就不一样了!这里port和rpcport都要修改!
我这里Ubuntu1 port用的是3000端口,rpcport用的是8545端口。
Ubuntu2 port用的是3001端口,rpcport用的是8546端口。
Ubuntu1启动命令:
geth --port 3000 --networkid 18 --datadir="data" --maxpeers=2 --rpc --rpcport 8545 --rpcaddr 127.0.0.1 --rpccorsdomain "*" --rpcapi="db,eth,web3,personal,admin,txpool" console --allow-insecure-unlock
Ubuntu2启动命令:
geth --port 3001 --networkid 18 --datadir="data" --maxpeers=2 --rpc --rpcport 8546 --rpcaddr 127.0.0.1 --rpccorsdomain "*" --rpcapi="db,eth,web3,personal,admin,txpool" console --allow-insecure-unlock
出现如下字样就启动成功了,成功后会进入一个交互式控制台

创建账户
然后在私有链上创建用户并解锁用户账户(交易时必须要解锁)
Ubuntu1创建用户1:
创建:personal.newAccount("1")
解锁:personal.unlock("password","1",0)三个参数分别为密码,账户,什么时候解锁的时间
密码会在创建账户时生成,密码可以单独touch一个文件放一下,后面挖矿时也会用

Ubuntu创建用户2:
创建:personal.newAccount("2")
解锁:personal.unlock("password","2",0)

连接节点
然后准备连接两台虚拟机,在目标虚拟机(192.168.23.122)输入admin.nodeInfo.enode来查看enode,然后用另一台虚拟机连接,执行admin.addPeer()指令来连接指令,peercount=1即连接成功了另一台虚拟机。我的两台虚拟机ip分别为192.168.23.121和192.168.23.122,这里我想用第一台121去连接第二台122


挖矿和转账
准备挖矿
首先输入指令Miner.setEtherbase()指令设置矿工受益账户
并通过web3.fromWei(eth.getBalance(eth.coinbase), "ether")查看账户余额
Miner.setEtherbase("password")
web3.fromWei(eth.getBalance(eth.coinbase), "ether")
分别将刚创建的两个账号"1"、"2"设为受益账户

miner.start()开始挖矿(参数为挖矿时使用的线程数)
miner.start(1)
Persentage=100 后就可以开始挖矿了

可以通过eth.blockNumber确认是否正在挖矿,如果返回的值在增加,说明在挖矿

Miner.stop()停止挖矿,再次查看余额:

可以看到余额增加到了150
账户间的交易:
注:发起的转账是一笔交易,需要矿工打包挖矿后,交易才会被确认,所以需要再次挖矿实现交易
向另一台虚拟机的账户2发起转账:
Eth.sendTransaction({from:”a”,yo:”b”,value:web3.toWei(10,ether”),gas:21000,gasPrice:web3.toWei(20,”gwei”)})
这里分别替换a、b为账户1、2的密码
然后再次挖矿实现转账

miner.stop()后去到第二台虚拟机查看余额

完成转账。
2477






