【区块链】私有链的搭建与简单智能合约

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

1.1 geth下载与安装

  1. 下载并安装Geth:Geth官网下载地址

  2. 环境变量配置。

  3. 下载完成后,在D盘创建一个文件夹eth用于存储数据。配置创世块genesis.json文件如下:

{
    "config": {
          "chainId": 0,
          "homesteadBlock": 0,
          "eip155Block": 0,
          "eip158Block": 0
      },
    "alloc"      : {},
    "coinbase"   : "0x0000000000000000000000000000000000000000",
    "difficulty" : "0x20000",
    "extraData"  : "",
    "gasLimit"   : "0x2fefd8",
    "nonce"      : "0x0000000000000042",
    "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp"  : "0x00"
  }

1.2 创世区块的搭建

  1. 在命令行输入geth --datadir "D:\eth" init "D:\eth\genesis.json"命令,指定私链的数据目录并进行节点初始化。至此就建立好了一个创世区块。
    在这里插入图片描述

  2. 输入命令geth --datadir "D:\eth" --port 30303 --networkid 99 --nodiscover console,进入geth控制台。
    在这里插入图片描述

1.3 私有链节点的加入

  1. 输入命令 geth --datadir "/chain0" init genesis.json 创建节点。这里创建了两个节点。
    在这里插入图片描述
  2. 输入命令 geth --datadir "\chain0" --port 30303 --networkid 99 --nodiscover console 启动节点。同时启动两个节点需要使port不同。
    在这里插入图片描述
  3. 在1号节点的控制台输入命令admin.nodeInfo.enode查看节点信息;在0号控制台使用addPeer()添加节点。
    在这里插入图片描述
    在这里插入图片描述
  4. 使用net.peerCount``admin.peers查看添加的节点数量和节点信息
    在这里插入图片描述

2. getBlock()字段解释

在这里插入图片描述

  • Difficulty:表示当前区块的难度。
  • ExtraData:与此区块相关的附加数据。
  • gasLimit:当前区块允许使用的最大gas。
  • gasUsed:当前区块累计使用的gas。
  • Hash:区块的哈希值。如果区块没有被确认,这个字段会是null值。
  • LogsBloom:区块日志的布隆过滤器,区块没被确认是值为null。 Miner:取得该区块记账权的矿工。
  • mixHash:一个Hash值,当与nonce组合时,证明此区块已经执行了足够的计算。 nonce:POW生成的哈希值。
  • Number:区块号。
  • parentHash:前一个区块的哈希值。
  • receiptsRoot:收据树的根哈希值。
  • Sha3Uncles:数据块的哈希值。
  • Size:当前区块的字节大小。
  • stateRoot:区块状态树的根哈希。
  • Timestamp:区块打包时的unix时间戳。
  • totalDifficulty:区块链到当前区块的总难度。
  • Transactions:交易的对象。
  • transactionsRoot:区块的交易树的根哈希。
  • Uncles:叔哈希的数组。

3. 日志输出解释

在命令中加入2>>geth.log,可以将控制台信息输出到日志。其中记录了信息类型(INFO / WARN等)、信息输出时间、信息内容。
在这里插入图片描述

除控制台信息外,日志文件还记录了网络状况以及网络协议信息。
在这里插入图片描述

  • Started P2P networking 表示P2P服务开启。
  • HTTP endpoint opened 表示HTTP终端开启。
  • Blockchain manager stopped表示区块链管理器停止。
  • Stopping Ethereum protocol表示终止以太网协议。
  • Transaction pool stopped表示终止事务池。

4. 编写简单的智能合约,在 remix 下进行调试,并部署在链上进行调用

  1. 编写一个简单的智能合约,代码如下
pragma solidity 0.5.11;

contract hello {

  function multiply(uint a) pure public returns (uint) {
    return a*3;
  }
}
  1. 将这段代码放入Remix(浏览器IDE),保存后点击左侧Compilation Details,在弹框内找到代码段WEBDEPLOY.
    在这里插入图片描述
var helloContract = web3.eth.contract([{"constant":true,"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"multiply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"}]);
var hello = helloContract.new(
   {
     from: web3.eth.accounts[0], 
     data: '0x6080604052348015600f57600080fd5b5060ae8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063c6888fa114602d575b600080fd5b605660048036036020811015604157600080fd5b8101908080359060200190929190505050606c565b6040518082815260200191505060405180910390f35b600060038202905091905056fea265627a7a72315820b6e72b6de9f4cfd60d1ccb57b3673ef8f82a583403c034a9fc97e6aa8868c32b64736f6c634300050b0032', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })
  1. 成功部署合约在这里插入图片描述
    在这里插入图片描述
  2. 调用合约
Demo=eth.contract(hello.abi).at("0xb52cd969d662288f57e6a014f611bc4d25f5a89c") 

在这里插入图片描述
在这里插入图片描述

5. 对交易的字段进行解释

  1. 创建账号:输入personal.newAccount("password"),成功创建账号。输入personal.listAccounts,可以看到创建成功的账号地址。此时使用eth.getBalance(eth.accounts[0])命令查看账户余额为0。
    在这里插入图片描述
  2. 挖矿:miner.start()进行挖矿,miner.stop()停止挖矿。一段时间后挖矿成功,再次查看账户0的余额,发现多出了很多资产。
    在这里插入图片描述
  3. 再次创建一个账号。查看新账号的余额为0。
    在这里插入图片描述
    在这里插入图片描述
  4. 使用personal.unlockAccount()为账户解锁,需要输入密码。
    在这里插入图片描述
  5. web3.fromWei(eth.getBalance(eth.accounts[0])):转账前进行余额查询,将单位Wei转换为ether。
    在这里插入图片描述
  6. 进行转账amount = web3.toWei(0.98)
    eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: amount})在这里插入图片描述
  7. 转账成功
    在这里插入图片描述
  8. 查看交易信息
    eth.getTransaction("事务地址")
    在这里插入图片描述
  • blockHash:这个交易所在的块的哈希值。
  • blockNumber:这个交易所在的块的编号。
  • from:发起这个交易的账户或者用户。
  • gas:执行这个交易所需要的gas。
  • gasPrice:当前gas与以太币换算的汇率。
  • hash:当前这个交易的哈希值。
  • input:这里是部署智能合约的交易,所以这里的input是合约的16进制代码。
  • nonce:这里的是交易下的nonce值,是账户发起交易所维护的nonce,一个交易对应一个nonce值,注意区分区块中的nonce,区块中的nonce是用于POW的nonce。
  • r,v,s:交易签名和用去决定交易的发送者的对应值。
  • to:交易接收着的地址。这里是合约的创建,合约账户的地址还没有,所以是null。
  • transactionIndex:这个交易在其对应区块的序号。
  • value:指交易要给交易接收着发送的以太币数量。
原文链接:加载失败,请重新获取