以太坊私有网络的设置与体验

2023-11-18

记录一下搭建一个以太坊私有网络环境的过程,方便以后的开发

我这里采用的是Geth客户端,在geth.ethereum.org网站上有详细的文档介绍,这里主要是按照官网的教程来操作。

安装

我是Ubuntu的环境,执行以下命令来安装

sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

设置私有网络

首先需要设置一个network id以便和其他以太坊网络隔绝开。以太坊主网络的network id是1,我这里设置为15

其次是选择共识算法,有proof-of-work和proof-of-authority两种,其中proof-of-work是现在主要的算法,另一种我理解还是处于实验性质的,因此还是先选择proof-of-work

我们可以先创建一个账号

geth account new --datadir data

运行之后就会显示一个账号的地址,例如我得到的地址是0xbDfa9d9C5656a2e4f09d53768DA17044AfE4F4d7

之后就是创建一个创世block,这也是我这个区块链开始的第一个block。这个block是通过genesis.json文件来进行配置,官网的例子如下:

{
  "config": {
    "chainId": 15,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "ethash": {}
  },
  "difficulty": "1",
  "gasLimit": "8000000",
  "alloc": {
    "bDfa9d9C5656a2e4f09d53768DA17044AfE4F4d7": { "balance": "300000" }
  }
}

这里面chainId代表network id,difficulty的值代表挖矿的难度,因为是私有网络,这里设置一个最小值即可。alloc里面代表要给哪些账号分配初始的以太币,这里是分配给我刚才创建的账号300000个wei,wei是以太坊的最小单位,1个以太币等于10^18个wei。

在我的系统中新建一个blockchain的目录,里面建一个data子目录,把genesis.json文件放在blockchain目录中,运行以下命令来初始化Geth数据库,使用这个创世block的配置文件来新建一个区块链节点。

geth init --datadir data genesis.json

创建之后我们就可以启动这个节点了,运行以下命令

geth --datadir data --networkid 15

从运行输出的结果里面我们可以看到IPC endpoint ended这句话,我们可以打开一个新的命令行终端,通过IPC URL来连接并启动javascript控制台

geth attach data/geth.ipc

挖矿

进入到Geth控制台之后,我们可以试一下挖矿到我们现有的这个账号。以下命令显示解锁账号,然后设置coinbase,之后就可以挖矿了。minser.start可以指定用多少个CPU线程来挖矿。

personal.unlockAccount(eth.accounts[0])
miner.setEtherbase(eth.accounts[0])
miner.start(1)

观察之前启动区块链节点的命令行终端输出的日志,会看到类似commint new mining work, mined potential block之类的信息,这就表示挖矿的任务在进行并成功挖到矿了。如果我们想停止挖矿,可以输入miner.stop()来终止。

过一段时间后,我们就可以查看挖到多少矿了。

web3.fromWei(eth.getBalance(eth.accounts[0]))

交易

现在我们可以创建一个新的account,以便转账一些以太币到这个账号上。

personal.newAccount()

得到的新的账号的地址是0x3312521d5892d45eb23b38c95375d9376dca8e0b

然后就可以转一些钱到这个新的账号

personal.unlockAccount(eth.accounts[0])
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:1e18,data:utils.toHex('This is a test')})

完成之后我们会得到交易的Hash值,"0xa69ae61b029a9e2ea46a075872e079829f770dbf94801586ad157c266010d9a5"

这时候查看eth.accounts[1]的余额还是0,因为没有人挖矿,所以交易没有被确认写入到区块链账簿里面。我们可以挖一下矿,过一会儿再查看就能看到余额会变为1个以太币了。

我们可以查看刚才的交易

eth.getTransaction('0xa69ae61b029a9e2ea46a075872e079829f770dbf94801586ad157c266010d9a5')

智能合约

以太坊最令人兴奋的特性就是支持智能合约。现在我们可以创建一个智能合约并部署到网络上了。

以下是一个简单的智能合约的代码:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

/**
 * @title Storage
 * @dev Store & retrieve value in a variable
 */
contract Storage {

    uint256 number;

    /**
     * @dev Store value in variable
     * @param num value to store
     */
    function store(uint256 num) public {
        number = num;
    }

    /**
     * @dev Return value 
     * @return value of 'number'
     */
    function retrieve() public view returns (uint256){
        return number;
    }
}

为了能在python中编译solidity语言编写的合约,需要安装以下的包

pip install py-solc-x

之后我们可以通过web3.py这个库来进行操作

 1.首先是连接到我们的以太坊节点,如果连接成功就会打印True

from web3 import Web3
w3 = Web3(Web3.IPCProvider('data/geth.ipc'))
print(w3.isConnected())

 2.查看当前的accounts,并查询余额,单位为ether

for account in w3.eth.accounts:
    print("Account:{}, Balance:{} ether".format(account, Web3.fromWei(w3.eth.get_balance(account), 'ether')))

 3.设置一个默认账号并解锁,后续将用这个账号来部署合约

w3.eth.default_account=w3.eth.accounts[0]
w3.geth.personal.unlockAccount(w3.eth.accounts[0], password)

 4.编译并部署合约

import solcx
from solcx import compile_source

solcx.install_solc()

def compile_source_file(file_path):
    with open(file_path, 'r') as f:
        source = f.read()
    return compile_source(source)

def deploy_contract(w3, contract_interface):
    tx_hash = w3.eth.contract(
        abi=contract_interface['abi'],
        bytecode=contract_interface['bin']).constructor().transact()
    return tx_hash

contract_source_path = 'storage.sol'
compiled_sol = compile_source_file('storage.sol')
contract_id, contract_interface = compiled_sol.popitem()
transcation_hash = deploy_contract(w3, contract_interface)

 5.开启挖矿,过一段时间之后查询合约的地址

w3.geth.miner.start(1)
#Wait some time
contract_address = w3.eth.get_transaction_receipt(transaction_hash)['contractAddress']

  6.拿到合约地址,表示合约已经记录在区块链账簿上了。实例化合约并调用store方法来存储一个数值,过一段时间等矿工执行并记录到账簿之后,即可调用retrieve方法来获取刚才存储的数值

contract_instance = w3.eth.contract(address=contract_address, abi=contract_interface['abi'])
contract_instance.functions.store(101).transact()
#Wait some time
contract_instance.functions.retrieve().call()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以太坊私有网络的设置与体验 的相关文章

随机推荐

  • C++报错无效的预处理命令include_C语言:全局变量在多个c文件中公用的方法!

    用C语言编写程序的时候 我们经常会遇到这样一种情况 希望在头文件中定义一个全局变量 然后包含到两个不同的c文件中 希望这个全局变量能在两个文件中共用 举例说明 项目文件夹project下有main c common c和common h三个
  • strapi的使用(一)

    一 strapi strapi是一个基于nodejs的CMS 内容管理系统 服务基于koa2 可以通过可视化页面简单的操作数据库建表 修改数据 配置权限等等 前端可以根据RESTful API 设计规范请求strapi默认配置的接口 获取到
  • 单片机设计_单路测温系统(AT89C51、DS18B20温度传感器、LCD1602)

    单片机测温系统 想要更多项目私wo 一 简介 此系统主要由AT89C51 DS18B20温度模块和LCD1602组成 大致的原理是DS18B20温度采集到的数据传送给AT89C51的P3 3 INT1 外部中断1 最后通过LCD1602显示
  • 让开发人员偷懒的正则表达式

    正则表达式是一种基于特殊模式符号系统的文本处理系统 简而言之 它为程序员提供了轻松处理和验证字符串的能力 它代表了DRY Don t Repeat Yourself 原则的实现 在几乎所有支持的语言中 正则表达式模式根本不会改变形式 在后端
  • github部署本地

    github的java项目部署到本地 通过idea 1 注册github 如果你没有github的账号 那需要注册一个 注册github可以参考 https zhuanlan zhihu com p 103268406 当然 由于githu
  • SSM项目-基于Java+Mysql的大学生奖助学金发放管理系统(附论文+源码)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 当前专栏 Java毕业设计 精彩专栏推荐 安卓app毕业设计 微信小程序毕业设计 演示视频 ssm112大学生奖助学金发放管理系统演示 源码下载地址 https download cs
  • HCNP Routing&Switching之MAC安全

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Spark 源码阅读一-启动脚本

    Spark Complile Help Links Because spark 1 5 need maven version 3 3 3 so i track the branch 1 4 git branch a git checkout
  • Day13 static-静态变量

    一 static 1 关于JavaBean类中的成员变量 public class Student private String name private int age private String gender 新增老师姓名 publi
  • 网页访问计数器 html,网页计数器(访问量)

    1 PHP实现网站访问量计数器 思路 用户向服务器发出访问请求 服务器读取访问次数文件 1 向客户端返回 服务器保存新的浏览次数 新用户访问 重复即可 解决方案 主要算法 1 数据文件 counter dat 2 读出数据文件 打开文件 如
  • Python Web:Flask异步执行任务

    Flask 是 Python 中有名的轻量级同步 web 框架 在一些开发中 可能会遇到需要长时间处理的任务 此时就需要使用异步的方式来实现 让长时间任务在后台运行 先将本次请求的响应状态返回给前端 不让前端界面 卡顿 当异步任务处理好后
  • jQuery empty() vs remove()

    https stackoverflow com questions 3090662 jquery empty vs remove http www cnblogs com yeer archive 2009 06 10 1500682 ht
  • JavaSE复习笔记

    第一章 Java概述 一 计算机语言 机器语言 汇编语言 高级语言 二 跨平台原理 Java可以在一处开发到处运行 即在一类操作系统上开发的程序 可以在任何操作系统上运行 不同的操作系统有不同的JVM java是运行在JVM上 从而实现了跨
  • win7系统打开定位服务器地址,win7 定位服务器地址

    win7 定位服务器地址 内容精选 换一换 您可以通过云日志服务 查看访问七层共享型负载均衡请求的详细日志记录 分析负载均衡的响应状态码 快速定位异常的后端服务器 您已经创建了七层负载均衡 您已经开通了云日志服务 登录管理控制台 在管理控制
  • 函数式组件与类组件有何不同?

    与React类组件相比 React函数式组件究竟有何不同 在过去一段时间里 典型的回答是类组件提供了更多的特性 比如state 当有了Hooks后 答案就不再是这样了 或许你曾听过它们中的某一个在性能上的表现优于另一个 那是哪一个 很多此类
  • MultipartFile实现文件上传和下载(Springboot)

    MultipartFile是SpringMVC提供简化上传操作的工具类 在不使用框架之前 都是使用原生的HttpServletRequest来接收上传的数据 文件是以二进制流传递到后端的 然后需要我们自己转换为File类 使用了Multip
  • 计算机专业选修课怎么选比较好,大一选修课选什么好 大学选修课推荐

    大学之于高中最大的不同点除了越来越多的自由时间以外 大学有各种各样的选修课供我们选择 在专业课之余 还可以选择其他自己感兴趣的学科进行学习 同时也能给自己增加一项技能 大学热门选修课 1 职场礼仪 礼仪是永远不会过时的 它是一个人的修养素质
  • 语法6:raise - 触发异常

    目录 1 基础格式 2 raise 单独语句 3 raise class 4 raise instance 5 raise from 6 try raise 实现循环跳出
  • JDK的命令行工具——修改中

    目录 一 jps 虚拟机进程状况工具 二 jstat 虚拟机统计信息监视工具 三 jinfo java配置信息工具 四 jmap java内存映像工具 五 jhat 虚拟机堆转储快照分析工具 仅做了解即可 六 jstack java堆栈跟踪
  • 以太坊私有网络的设置与体验

    记录一下搭建一个以太坊私有网络环境的过程 方便以后的开发 我这里采用的是Geth客户端 在geth ethereum org网站上有详细的文档介绍 这里主要是按照官网的教程来操作 安装 我是Ubuntu的环境 执行以下命令来安装 sudo