区块链学习之3Windows平台下以太坊私有链搭建及钱包部署和运行

时间:2024-03-11 12:07:27

在Windows下的安装,是按着老师下发的安装教程做的。由于前面有在Ubuntu搭建的经验,所以感觉步骤大致相同,而且感觉Windows的简单一些。


一、理论知识

1.区块链中私钥、公钥和比特币地址三者的关系

1.用户首先会得到一个私钥,私钥是由程序调用操作系统自带的一个算法模块,在本地自动的生成的。
2.然后钱包这个应用会将这个私钥通过椭圆曲线算法这个矩阵相乘,得到用户的公钥。因为是与矩阵相乘,所以公钥也是矩阵,横向和纵向都是32位。
3.因为公钥十分复杂、不方便使用,所以又通过哈希函数得到了一个比特币地址(也叫钱包地址)。

2.比特币地址与传统账号的区别

1.相同点:
都是进行交易的一个支付转账的“凭证”。
2.不同点:
(1)比特币地址是由区块链网络自发生成,而传统账号地址是由第三方机构生成。
(2)通过比特币地址查询到的是所有的转账记录,而传统账号查询到的是余额。

3.为什么一开始只是转账提交成功,需要矿工挖到新的区块才能算交易成功?

网上找了找相关的文章,我觉得下面这篇理解起来好懂一点:
https://www.zxbcc.com/ad/478

上面那篇文章讲的是原理,然后用我的话总结一下结论:
我们可以把 [挖矿行为] 理解为 [争夺记账权] ,所以 [挖到矿] 就可以理解为 [记了一笔账] 。
所以当我们想要转账的时候,一开始只是把转账信息提交成功,需要挖到新的区块,把这笔转账信息记到新的区块里,相当于 [把这笔账记下] 以后,才能算真正的交易成功。

4.区块链交易过程

假设Alice要向Bob转一笔账,那么需要解决以下问题;
1.如何证明Alice有钱?
答:公钥,通过公钥哈希判断出钱包地址是Alice的。

2.如何证明现在发起交易的是Alice?
答:数字签名,验证Alice的数字签名。

3.如何防止Alice的钱被使用两次(即“双花”问题)?
答:打标签(就像火车票检票一样)

在这里插入图片描述

二、实验操作

1.环境准备

1.安装Win10 虚拟机

这是官方的虚拟机下载地址:
https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

然后选择VMWare的就行:
在这里插入图片描述
然后直接导入就好:
在这里插入图片描述
开机密码是 Passw0rd!

(虚拟机里只有一个盘,C盘,所以接下来的实验都是在C盘完成的;如果用物理机的话,可以放在D盘E盘里)

2.安装Ethereum-Wallet

1.在C盘新建文件夹 Eth,专门放置以太坊开发环境 :
2.把下载的Ethereum-Wallet-win64-0-8-10.zip压缩包win-unpacked解压到 C:\Eth 目录下:

3.安装geth

1.geth下载:https://ethereum.github.io/go-ethereum/downloads/
2.安装geth,安装在 C:\Eth 目录下
3.在 C:\Eth 目录下创建 privatechain 文件,用以存放区块链数据。
在这里插入图片描述

2.以太坊私有链搭建

1.创建第一个节点

1.在 C:\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,进入 C:\Eth 目录下(该目录下有 geth.exegenesis.json 文件,便于运行geth命令),创世块文件初始化命令如下:

geth -datadir "%cd%\privatechain\node1" init genesis.json
  • –datadir:后面跟本节点数据存放的目录。
  • genesis.json:是init命令的参数。

执行该命令后会在 C:\Eth\privatechain下自动新建 node1 文件夹,并在node1下生成 gethkeystore 两个文件夹。

  • 其中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中执行命令*

在这里插入图片描述
出现这个页面则代表启动成功!

  • 注意:如果之前创建了用户,在启动过程中会提示输入密码:XXXXXX(即之前创建的账号) ,然后才会启动区块链节点并进入Javascript Console。

3.以太坊私有链节点操作

1.新建账户:

personal.newAccount("密码")

创建成功以后将会返回账户的地址:
在这里插入图片描述

如果没有账号直接开始挖矿的话,会遇到如下报错:
在这里插入图片描述
2.查看矿工账户:

eth.coinbase

3.设置挖矿的账号

miner.setEtherbase("账户地址")

4.开始挖矿:

miner.start(1)
  • 括号中的1表示用一个线程进行挖矿,如果不配置,就会不断消耗计算机资源,让CPU全速运行,影响计算机的使用。

出现以下界面就表示挖矿成功(那个问号代表的是小锤锤,这里没显示出来):
在这里插入图片描述

5.停止挖矿:

miner.stop()

返回值为true就对了。

第一次stop的时候也会初始化一次,不要慌,不要以为没停住……好吧我承认我当时慌了,连续执行了几次stop命令:
在这里插入图片描述
6.查看账户余额:

查询的是第一个账户的余额,当我们挖矿时,奖励金存储默认的是第一个账户。

eth.getBalance(eth.accounts[0])

在这里插入图片描述
换算成以太币的单位来查看余额:

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

在这里插入图片描述
7.转账

1.转账的前提是有两个账户,所以先新建一个账户:
在这里插入图片描述
2.转账前确认一下两个账户的余额:
在这里插入图片描述
3.解锁钱包,否则会报错:

personal.unlockAccount(eth.accounts[0])

在这里插入图片描述
4.开始转账:

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

在这里插入图片描述
现在只是转账提交成功,需要矿工挖到新的区块才能算交易成功。(原因上面的理论知识第3点已经讲过了)

5.再次执行挖矿命令后,查看余额:
在这里插入图片描述
转账成功!