在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.exe
和 genesis.json
文件,便于运行geth命令),创世块文件初始化命令如下:
geth -datadir "%cd%\privatechain\node1" init genesis.json
- –datadir:后面跟本节点数据存放的目录。
- genesis.json:是init命令的参数。
执行该命令后会在 C:\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中执行命令*
出现这个页面则代表启动成功!
- 注意:如果之前创建了用户,在启动过程中会提示输入密码: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.再次执行挖矿命令后,查看余额:
转账成功!