以太坊的安装、私有链创世区块搭建以及智能合约的部署

1. 以太坊的安装、私有链创世区块搭建、私有链节点的加入

1.1 以太坊的安装

官方下载地址:https://geth.ethereum.org/downloads/
下载相应系统版本的geth,安装成功后可以查看版本信息:
在这里插入图片描述

1.2 私有链创世区块搭建

  • 先创建一个genesis.json文件,内容如下:
    在这里插入图片描述

  • 使用geth --datadir “./chain” init ./genesis.json命令初始化创世区块
    –datadir指定当前区块链网络数据存放的位置在chain目录中。
    在这里插入图片描述

  • 启用私有链
    在这里插入图片描述
    –nodiscover:私有链地址,不会被网上看到;
    console:启动命令行模式,在Geth中执行命令;

    在当前目录执行tail -f eth_output.log,可以看到输出日志:
    在这里插入图片描述
    (注:windows要执行tail命令首先先下载tail.exe,并把该文件加入到C:\Windows\System32下,下载地址:http://files.cnblogs.com/hantianwei/tail.zip)

  • 添加和查看账户
    在这里插入图片描述在这里插入图片描述

  • 挖矿
    在这里插入图片描述
    这时eth_output.log可以看到挖矿的记录。
    再次查询余额发现不再是0,这是挖矿所得。
    在这里插入图片描述

1.3 私有链节点的加入

  • 查看第一个节点的enode url信息
    在这里插入图片描述

  • 再打开另一个终端,以相同的方式初始化第二个节点:
    在这里插入图片描述
    启动第二个节点:
    在这里插入图片描述
    因为在同一台计算机上,所以要指定另一个端口。

  • 把第一个节点作为peer添加进来
    在这里插入图片描述

  • 验证
    在第二个节点中输入:
    在这里插入图片描述
    第一个节点输入:
    在这里插入图片描述
    peerCount为1,且该peer的node id与第二个节点相符,说明添加成功。

2. 对getBlock中所得区块的各个字段的解释

在这里插入图片描述

  • difficulty:BigNumber,当前块的难度,会随着计算速度的变化而调整。
  • extraData: 字符串,额外数据,可以包含个性信息,或者是附加说明。
  • gasLimit:Number,设置对gas的消耗总量限制,用来限制区块能包含的交易信息总和。
  • gasUsed:Number,当前区块累计使用的总的gas
  • hash:字符串,区块的哈希值
  • logsBloom:字符串,由日志信息组成的一个Bloom过滤器(数据结构)
  • miner:字符串,20字节,挖出该区块(获得奖励)的矿工
  • mixHash:一个Hash值,当与nonce组合时,证明此区块已经执行了足够的计算
  • nonce:字符串,8字节,POW生成的哈希,当与mixHash组合时,证明此区块已经执行了足够的计算
  • number:当前区块的计数(从创世区块0开始递增1)
  • parentHash:字符串,32字节,父区块的Hash值
  • receiptsRoot:此区块所有交易收据的树的根节点Hash值
  • sha3Uncles:字符串,32字节,叔区块(父区块的兄弟区块)的哈希值
  • size:Number,当前区块的字节大小
  • stateRoot:字符串,32字节,此区块最终状态树根节点的Hash值
  • timestamp:Number,此区块初始化时的unix的时间戳
  • totalDifficulty:BigNumber,从区块链的第一个区块到此区块的难度的总和
  • transactions:数组,交易对象,或32字节的交易哈希
  • transactionsRoot:字符串,32字节,此区块的所有交易组成的树的根节点Hash值
  • uncles:数组,叔哈希(父区块的兄弟区块)的数组

其他未在这里出现的值:

  • ommerHash:当前区块ommers列表的Hash值
  • beneficiary:接收挖此区块奖励的账户地址

3. 对日志输出的解释

  • 启用时日志:
    主要是一些配置、协议的初始化;
    内存、缓存等的分配、生效和加载等。
    在这里插入图片描述
    在这里插入图片描述

  • 挖矿日志:
    Updated mining threads:每次开始挖矿时更新挖矿线程;
    Transaction pool price threshold updated:每次开始挖矿时更新交易池的价格阈值;
    Commit new mining work:提交新的挖矿工作;
    Generating DAG in progress:挖矿一开始都要生成DAG(Directed Acyclic Graph,有向无环图),从生成的DAG里面找随机数做hash,生成之后就正常挖矿了;
    Successfully sealed new block:成功封装新区块;
    block reached canonical chain:区块到达权威链,number是区块号;
    mined potential block:挖矿,挖掘潜在区块。
    在这里插入图片描述
    在这里插入图片描述

  • 其他
    Seting new local account:设置新本地账户
    Submitted transaction:提交交易
    在这里插入图片描述

4. 智能合约的部署

  • 编写简单智能合约
    在这里插入图片描述
  • 在Remix下编译合约
    在这里插入图片描述
    编译成功后,点击Details会弹出一个信息框,复制WEB3DEPLOY框中的代码:
    在这里插入图片描述
  • 部署合约
    • 在geth启用私链,解锁账户地址:
      在这里插入图片描述
    • 开始挖矿产生新的区块,合约才能成功部署。开始挖矿后,把复制的代码粘贴进来,回车,过一会能看到Contract mined! 说明部署成功。
      在这里插入图片描述
    • 现在可以在geth中调用合约中的函数f:(3 * 8 = 24)
      在这里插入图片描述

5. 对交易的字段的解释

解锁账户 --> 发送交易 --> 挖矿 --> 查询交易
在这里插入图片描述
blockHash:交易所在块的Hash;
blockNumber:交易所在块的块号;
from:交易发送者的地址;
gas:该交易允许消耗的最大gas数量;
gasPrice:交易发送者愿意支付给矿工的gas单价;
nonce:用来区别同一用户发出的不同交易的标记;
hash:该交易的哈希值,作为交易的ID;
input:存在的数据字段,如果存在,则表明该交易是一个创建或者调用智能合约交易;
to:交易接收者的地址;
r、s、v:交易签名的三个部分,由发送者的私钥对交易hash进行签名生成。
value:发送者要转移给接收者的以太币数量;


6. 附:常用指令小记

  • 初始化一个创世区块,启用私链,显示输出日志
    geth --datadir “./chain” init ./genesis.json
    geth --datadir “./chain” --nodiscover console 2>>eth_output.log
    tail -f eth_output.log

  • 查看账户信息
    (web3.)eth.accounts
    (web3.)eth.accounts[0]
    (web3.)eth.getBalance[eth.accounts[0]]
    web3.fromWei(web3.eth.getBalance(acc0))
    web3.toWei(3,“ether”)

  • 创建与解锁账户
    (web3.)personal.newAccount(“123456”)
    acc0 = web3.eth.accounts[0]
    (web3.)personal.unlockAccount(acc0,“123456”)

  • 挖矿
    miner.start(1)
    miner.stop()

  • 交易相关
    eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,“ether”)})
    eth.getTransaction(“0x78af0530e0e77c3b5b8a91a0720a11abe4436500a169953234ec987ebb3725c7”)

猜你喜欢

转载自blog.csdn.net/Runner1st/article/details/88046634