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


    在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
    ode1" init genesis.json
    
    • –datadir:后面跟本节点数据存放的目录。
    • genesis.json:是init命令的参数。

    执行该命令后会在 C:Ethprivatechain下自动新建 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
    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中执行命令*

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

    • 注意:如果之前创建了用户,在启动过程中会提示输入密码: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.再次执行挖矿命令后,查看余额:
    在这里插入图片描述
    转账成功!

  • 相关阅读:
    mysql 优化(包含sql语句的书写)
    tomcat优化
    MySQL——修改root密码的4种方法(以windows为例)
    实现窗口中的文档自动向上滚动,方便阅读
    处理文本框的鼠标事件,判断鼠标的状态
    通过给事件处理程序传递this参数,获取事件源对象的引用。单机提交按钮时在信息框中显示用户输入的字符。
    在标签的事件属性字符串中编写程序,检查用户输入的密码明文
    通过使用浏览器对象模型,输出当前浏览器窗口中打开的文档的URL信息,并将显示在窗口中。
    创建一个卡片对象,卡片上标有“名字”、“地址”和“电话”等信息。名片对象提供一个方法以输出这些信息。
    测试Array对象的sort方法的作用。将1985,1970,1999,1998,2000,1963这些年份按升序输出。
  • 原文地址:https://www.cnblogs.com/augustuss/p/12700871.html
Copyright © 2020-2023  润新知