热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Windows下pythonweb3.py、geth、solc的安装使用以及简单的私链连接和智能合约的部署

文章目录一、环境准备geth的安装及简单使用一、安装二、使用1.创建私链2.初始化创世区块3.启动私有链4.Geth使用1、查询账户列表2、创建新账户3、查询账户余额4、启动或停止

文章目录

  • 一、环境准备
    • geth的安装及简单使用
      • 一、安装
      • 二、使用
        • 1. 创建私链
        • 2. 初始化创世区块
        • 3. 启动私有链
        • 4. Geth 使用
          • 1、查询账户列表
          • 2、创建新账户
          • 3、查询账户余额
          • 4、启动或停止挖矿
          • 5、解锁账户
          • 6、发送以太
    • 安装python3.8和安装web3.py
    • 安装nodejs以及solc
  • 二、利用web3.py进行简单的私链连接
  • 三、部署智能合约并进行简单的调用


一、环境准备

使用的环境包括:

  1. geth
  2. python3.8
  3. web3.py
  4. solc

geth的安装及简单使用


一、安装

地址:https://geth.ethereum.org/downloads/

找到对应的操作系统安装最新的版本就好(一般这里如果安装最新的,下面的web3.py也需要最新版,不然可能会出现各种错误!!!)

我的版本是:
在这里插入图片描述
下载好后,双击geth-windows-amd64-1.10.1-c2d2f4ed.exe一直下一步即可,最后关掉安装页面。

安装后用cmd命令打开命令行,进入到你安装geth的目录下(在C盘的Program Files目录下会生成Geth目录),输入geth help命令,如果输出一大堆关于geth的信息如下图则说明安装成功。当前geth命令只能在geth对应的目录下使用,如果想要在任何目录使用geth命令,只要把你安装geth的目录的路径加入到系统环境环境变量path中即可。
在这里插入图片描述

二、使用


1. 创建私链

在某个磁盘创建一个数据存储目录如E:\PycharmProjects\btc,新建创世区块描述文件genesis.json,内容如下:

{"config":{"chainId":9,"homesteadBlock":0,"eip155Block":0,"eip158Block":0},"nonce":"0x0000000000000042","timestamp":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","extraData":"0x00000000","gasLimit":"0x80000000","difficulty":"0x1","mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000","coinbase":"0x3333333333333333333333333333333333333333","alloc": {}
}

各个参数的作用:

参数作用
config定义链配置,会影响共识协议,对创世影响不大,但新区块的产出规则均依赖该项。
nonce64为随机数,用于挖矿,对应创世区块的Nonce字段,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
timestampUTC时间戳,对应创世区块的Time字段。
parentHash父哈希,上一个区块的hash值,这里因为是创世区块,所以值为0
extraData附加信息,随便填,可以填个性信息。
gasLimit该值设置对gas的消耗总量限制,用来限制区块所能包含的交易信息总和,因为是私链,填写最大以后不需更改。
difficulty设置当前区块的难度,用于挖矿,难度越大挖矿越难,这里设置较小难度。
mixhash与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
coinbase旷工账户,随便填
alloc用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可。

2. 初始化创世区块

在命令行窗口进入到E:\PycharmProjects\btc目录下,执行创世区块的初始化,命令如下:

geth --datadir "./" init genesis.json

在这里插入图片描述
此时在btc目录下会生成geth和keystore目录,geth目录存储区块数据,keystore目录则保存账户信息。
在这里插入图片描述

3. 启动私有链

命令行下输入:

geth --datadir data --networkid 989898 --rpc console --port 30304 --rpcport 8545 --rpccorsdomain "*" --ws --allow-insecure-unlock --nodiscover

Geth客户端启动私链一直显示looking for peer……解决办法

–networkid 123参数表示区块链网络ID标识,–nodiscover参数表示节点私有,console参数表示进入geth控制台

连接测试网进入控制台,此时我们已经进入geth测试网的交互式控制台,窗口也显示「Welcome to the Geth Javascript console」成功提示!

在这里插入图片描述

4. Geth 使用

在以太坊网络中,账户是其重要的组成部分,下面我们以查询链上账户列表开始常用的指令功能。

1、查询账户列表

输入指令:eth.accounts 输出结果:[]
在这里插入图片描述

含义:意思是无账户地址,因为我们什么也没做,所以当然是不会凭空出现账户了。

2、创建新账户

输入指令:personal.newAccount(“123”) 输出结果:
在这里插入图片描述

含义:表明账户新建成功,返回账户地址,123为账户密码。最下面绿色的就是公钥生成出来的地址,这个地址不需要记住。此时我们再次查询账户列表会发现已有刚创建的地址了。
在这里插入图片描述

3、查询账户余额

输入指令:eth.getBalance(eth.accounts[0]) 输出结果:0
在这里插入图片描述

含义:表明这个账户的余额是0。

4、启动或停止挖矿

miner.start():开始挖矿
miner.stop():停止挖矿
eth.coinbase:查看挖矿账户
在这里插入图片描述
重新指定挖矿账户(默认挖矿账户为eth.accounts[0]):miner.setEtherbase(eth.aaccounts[1])

5、解锁账户

这个在刚开始使用geth阶段经常使用,想避免多次使用改命令的解决办法是-使用离线签名

personal.unlockAccount(eth.accounts[0],“你创建时的密码”)

在这里插入图片描述
在以太坊,凡是涉及到账户操作(外部账户:以太发送、发布、调用合约等)都需要事先解锁账户

6、发送以太

personal.sendTransaction({from:发送方账户,to:接收方账户,value:发送以太数目},“发送方账户密码”)

发送完之后必须进行挖矿才能真正完成以太发送,其实就把以太坊当成账本,任何变动都需要记账,“记账的实现方式就是挖矿”。

安装python3.8和安装web3.py

我的版本:
python3.8.6
web3.py 5.1.0

web3.py直接使用pip install web3命令安装即可

pip install web3 不能直接成功的看这里吧,真的是血泪史:pip install web3 一直失败!!!

安装nodejs以及solc

说明:这里主要是利用solc对solidity编写的智能合约进行编译!
百度搜索 nodejs 进行安装。
测试安装成功与否:
在这里插入图片描述
在这里插入图片描述

二、利用web3.py进行简单的私链连接

from web3 import Web3, HTTPProviderw3 = Web3(HTTPProvider("http://localhost:8545")) # 有疑问请看web3.py官网
if w3.eth.getBlock(0) is None:print("连接失败")
elif w3.isConnected():print("连接成功")

在这里插入图片描述
web3.py的几种连接以太坊节点的方法

三、部署智能合约并进行简单的调用

1、使用 remix 网页编辑器进行智能合约编写,合约代码如下:

pragma solidity 0.8.3; contract HelloWorld {event CreatePeopleLog(address indexed creator,string name,uint age);event SendEthToUserLog(address indexed sender,address indexed accepter,uint money);enum Sex{man,woman}struct Human{address payable addr;string name;uint age;Sex sex;}mapping(address => Human) public people;uint numOfPeople = 0;function CreatePeople(string memory _name,uint _age,Sex _sex,address payable _addr) public{Human memory human = Human({addr:_addr,name:_name,age:_age,sex:_sex});numOfPeople += 1;people[_addr] = human;emit CreatePeopleLog(_addr,people[_addr].name,people[_addr].age);}function SendEthToUser(address payable _accepter) public payable{_accepter.transfer(msg.value);emit SendEthToUserLog(msg.sender,_accepter,msg.value);}uint public luckyNum;constructor() public{luckyNum = 888;}function SetLuckyNum(uint _num) public{luckyNum = _num;}function printHelloWorld() public returns(string memory){return 'Hello,World!';}
}

2、solc编译智能合约获取ABI

创建一个文件夹contract,创建.sol文件myContract.sol,将上面智能合约代码复制到myContract.sol并保存。使用命令行(这里命令行要先进入到保存myContract.sol文件的目录下,例如myContract.sol保存在D:\contract,需要先cd D:\contract再使用solcjs):

solcjs myContract.sol --optimize --bin --abi --output-dir E:\\PycharmProjects\\contract

在这里插入图片描述
3、python使用web3.py调用智能合约
python代码为:

from web3 import Web3, HTTPProvider
import json
class ethereumHandler():def __init__(self):self.web3 = Web3(HTTPProvider("http://localhost:8545"))# 检查是否连接成功if self.web3.eth.getBlock(0) is None:print("Failed to connect!")elif self.web3.isConnected():# read the abi# r"D:\pycharm_code\contract\myContract_sol_baseContract.abi", 'r'with open(r"E:\PycharmProjects\contract\myContract_sol_HelloWorld.abi", 'r') as fo:preabi = fo.read()# print(self.preabi)myabi = json.loads(preabi)self.myContractAddr = Web3.toChecksumAddress('0xa46c666d76e5c044cd8d6b21d3cdf76d5571f48e')self.myContract = self.web3.eth.contract(address=self.myContractAddr, abi=myabi)print("Successfully connected")print(self.myContract.all_functions())"""检查传入地址是否正确,不正确则转换为正确地址并返回"""def CheckAddress(self, _address):if self.web3.isChecksumAddress(_address):return _addresselse:return self.web3.toChecksumAddress(_address)def unlockAccount(self, _addr):self.web3.geth.personal.unlockAccount(self.CheckAddress(_addr), "123")def SetLuckyNum(self, _addr, _num):self.unlockAccount(_addr)tx_hash = self.myContract.functions.SetLuckyNum(int(_num)).transact()return self.web3.toHex(tx_hash)def GetHuman(self, _addr):human = self.myContract.functions.people(self.CheckAddress(_addr)).call()print(human)def PrintHelloWorld(self):mystr = self.myContract.functions.printHelloWorld().call()print("调用合约函数printHelloWorld结果:", mystr)def SendEthToUser(self, _senderAddr, _accepterAddr, _money):self.unlockAccount(_senderAddr)tx_hash = self.myContract.functions.SendEthToUser(self.CheckAddress(_accepterAddr)).transact({'from': self.CheckAddress(_senderAddr),'value': self.web3.toWei(_money, "ether")})return self.web3.toHex(tx_hash)def GetLuckyNum(self):luckynum = self.myContract.functions.luckyNum().call()print("获取的幸运号码为:", luckynum)def CreatePeople(self, _addr, _name, _age, _sex):self.unlockAccount(_addr)tx_hash = self.myContract.functions.CreatePeople(_name, _age, _sex).transact({'from': self.CheckAddress(_addr)})return self.web3.toHex(tx_hash)def GetBalance(self, _addr):balance = self.web3.eth.getBalance(self.CheckAddress(_addr))print(("\n账户:{} \n余额: {}").format(str(self.CheckAddress(_addr)), str(balance)))# 这里仅调用两个,剩余可以自己测试
e1 = ethereumHandler()
e1.GetLuckyNum()
e1.PrintHelloWorld()


推荐阅读
  • 起因由于我录制过一个小程序的课程,里面有消息模板的讲解。最近有几位同学反馈官方要取消消息模板,使用订阅消息。为了方便大家容易学 PythonFlask构建微信小程序订餐系统 课程。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • [币萌研究院] 项目简报Agoric (BLD)
    [币萌研究院] 项目简报Agoric (BLD) ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • python限制递归次数(python最大公约数递归)
    本文目录一览:1、python为什么要进行递归限制 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • 常用工具(一)
    1.时间戳在线转换工具(1)链接https:tool.lutimestamp(2)说明可以通过此工具:将时间戳转为具体时间点,也可以将具体时间点转为时间戳(3)效果2.JSON在线 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • 作者|COLINHARPER译者|火火酱责编|徐威龙封图|CSDN下载于视觉中国“通过使用微支付通道网络,借助当今现代台式计算机上可用的计算能力,比特币 ... [详细]
author-avatar
carefulff
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有