Geth+Web3.py 搭建ETH私链并发起交易

写在前面

  • 最近打了场Hackthon区块链主题,成功进击币圈,结果还行拿了第一,如今来总结一下,省得之后忘了;
  • 整体本文将介绍Web3.py+geth如何实现;
  • 1.搭建ETH私链测试环境 2.Python代码与ETH互通即发起交易获取交易信息;

GETH

Geth 又名Go Ethereum.
是以太坊协议的三种实现之一,由Go语言开发,彻底开源的项目。
Geth 能够被安装在不少操做系统上,包括Windows、Linux、Mac的OSX、Android或者IOS系统python

Geth官网:点击我
Geth的Github地址:点击我
git

官网中有下载安装的相关教程。
github

测试私链搭建

  1. 在目录下新建genesis.json
{
	"config": {
        "chainId": 10,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
	 "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x020000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00",
  "alloc"      : {}
  }
复制代码

参数的简单介绍
config.chainId // 以太链的ID,用来惟一标记一条以太链 不用管
coinbase // 矿工帐号,第一个区块挖出后将给这个矿工帐号发送奖励 不用管
difficulty // 难度值,越大越难 当前值为最轻松的状况
extraData // 附加信息随便填 不用管
gasLimit // gas 的消耗总量限制,用来限制区块能包含的交易信息总和,由于咱们是私有链,因此填最大 gas和写入数据成正比写入越多gas越贵
nonce // 一个 64 位随机数
mixhash // 与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash
parentHash // 上一个区块的 hash 值
alloc // 预设帐号以及帐号的以太币数量,这里不作配置
2. 执行 geth --datadir "./" init genesis.json
开始在当前目录生成ETH私链
关于运行后面再说,先说Web3.py
web

Web3.py

Web3是一个经过RPC连接来间接经过geth发起交易获取区块链信息的python库
须要python 3.5+ 的环境支持 pip install web3
web3文档shell

Web+Geth

带参数启动geth

./geth --identity "HDetherum" --rpc --rpccorsdomain "*" --datadir "./" --port "30303" --rpcapi "db,personal,eth,net,web3" --networkid 95520 -nodiscover --verbosity=5 console 2>>geth.logjson

--identity 表示ETH标识ID
--rpccorsdomain 容许哪些URL接入当前区块
--datadir 区块链数据存放的地址
--rpcapi 全部可能被用到的RPC API都须要进行声明
--networkid 网络标识符(整型, 1=Frontier, 2=Morden (弃用), 3=Ropsten, 4=Rinkeby) 测试网络只要不和前几个重复就行了
api

这句命令主要是用来启动geth 并暴露出接口给Web3进行连接调用
执行完成后会出现geth.log在当前目录下。
下面给几个geth上经常使用的基本方法
网络

eth.accounts //获取当前链上全部帐户
personal.newAccount("123456") //建立一个密码为123456的钱包帐户
miner.satrt() //开始挖矿
miner.stop() //结束挖矿
复制代码

关于web3

发起交易和获取交易信息各一个例子cors

发起交易dom

form web3.auto import w3

# 返回值为区块hash地址
# 0x6d2629b8693d35ffd735d67d0e823108f1fc168b4162950900e22214732e386c
def set_trans(data=None):
    accounts = w3.eth.accounts
    w3.personal.unlockAccount(w3.eth.accounts[0], '7723')
    trans_id = w3.eth.sendTransaction({'to': w3.toChecksumAddress(accounts[1]), 'from': w3.eth.coinbase, 'value': 12345})
    print(trans_id)
    return trans_id
复制代码

得到交易信息

# 若是为None则矿工还没挖到该交易
# AttributeDict({
# 'blockHash': HexBytes('0x0000000000000000000000000000000000000000000000000000000000000000'),
# 'blockNumber': None,
# 'from': '0xE6829A20492D11A5C84b7B0F3240A99971d1FbFF',
# 'gas': 121680, 'gasPrice': 18000000000,
# 'hash': HexBytes('0x6d2629b8693d35ffd735d67d0e823108f1fc168b4162950900e22214732e386c'),
# 'input': '0x48656c6c6f576f726c64',
# 'nonce': 0, 'to': '0x2e8AAf37736C4CeAc8d0366Ffa97aA7B62957b72', 'transactionIndex': 0,
# 'value': 12345, 'v': 56, 'r': HexBytes('0x750bc8a9ef4f20e129c2a71a0c9d496aaacafd49f1d514c0c4d380887590fefc'),
# 's': HexBytes('0x37bbe55ef6363ee98d66e131fc862d9e8451353c8b1e2a5c8f3533304db72b42')})
def get_trans_detail(trans_id=None):
    information = w3.eth.getTransaction(trans_id)
    return information
复制代码

具体Web3的调用 查看文档 写的很详细 (又成功水了一篇 yes√)

相关文章
相关标签/搜索