区块链基础
以太坊(Ethereum)的底层是区块链技术,而区块链简单而言就是由Hash值串联起来的链表结构,链表中的节点会记录交易信息,如果将节点中的信息以JSON格式描述,看起来是这个样子:
{
"number": 1234567,
"hash": "0xabc123...",
"parentHash": "0xdef456...",
"miner": "0xa1b2c3...",
...,
"transactions": [...]
}
hash:当前节点的Hash值
parentHash:前一个节点的Hash值
miner:矿工地址
transactions:当前节点包含的交易数据
矿工接收交易数据后,会将其封装到一个区块里,并将区块信息广播到以太坊网络中,这里会有很多细节,建议找本书看看,这里想强调的是,想让矿工干活,需要花钱,在以太坊上,其货币称为「ether」。
使用Web3.py
Web3.py是一个用于与以太坊网络交互的Python库,它封装了很多操作,便于我们进行交易、与智能合约交互、读取区块中的数据等等。
Web3.py官方文档:https://web3py.readthedocs.io/en/stable/index.html
通过一张图,可以很清晰的知道我们开发的应用、Web3.py以及是以太坊网络的关系。
从上图可知,Web3.py其实就是中间层,它可以通过HTTP、IPC(进程间通信)、WebSocket的方法连接到以太坊节点,从而实现与整个以太坊网络的交互。
使用前,我们需要安装Web3.py:
pip install web3
pip install 'web3[tester]'
安装web3[tester]的目的时,使用Web3.py提供的模拟节点进行测试,如果我们要同步真正的节点需要做:
1.下载Geth构建以太坊节点。
2.启动Geth并等待它同步以太坊网络中的数据,Geth默认会启动HTTP服务,端口为8545.
3.使用Web3.py通过HTTP连接到刚刚构建好的节点。
4.使用Web3.py提供的API与节点进行交互
Geth是使用Go实现Ethereum协议的程序,与之类似的还是使用C++或Python实现的,只是Geth势头第一。
同步过程需要拉取数据,可能需要几个小时。
这里只是演示,所以直接使用模拟节点就好了,如下图:
上图中,Web3.py提供了4种接入以太坊节点的方式,其中第4种便是通过TesterProvider接入模拟的以太坊节点,要使用这个功能,你需要安装web3[tester]。
安装好web3后,先通过TesterProvider方法连接到模拟节点中。
In [1]: from web3 import Web3
# 使用EthereumTesterProvider,连接模拟节点
In [2]: w3 = Web3(Web3.EthereumTesterProvider())
# 判断连接是否正常
In [3]: w3.isConnected()