Skip to content
A python interface for interacting with the Ethereum blockchain and ecosystem.
Python Makefile
Branch: master
Clone or download
Pull request Compare This branch is 1403 commits behind ethereum:master.
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Update issue template. Jul 3, 2017
docs Release notes v4.0.0-beta.1 Nov 22, 2017
ens Replace is_address checks with is_checksum_address Nov 15, 2017
tests Merge pull request ethereum#439 from pipermerriam/carver/ens-name-con… Nov 22, 2017
web3 Merge pull request ethereum#442 from pipermerriam/carver/send-raw-bytes Nov 22, 2017
.bumpversion.cfg Bump version: 4.0.0-beta.1 → 4.0.0-beta.2 Nov 22, 2017
.gitignore docs: no more warnings on build Oct 13, 2017
.travis.yml Merge pull request ethereum#428 from pipermerriam/carver/geth-1.7.2 Nov 20, 2017 Add Apr 21, 2016 Update pull requests link Oct 25, 2017
Dockerfile Add docker-compose for running sandbox environment Nov 18, 2017
LICENSE initial commit Apr 14, 2016 initial commit Apr 14, 2016
Makefile docs: no more warnings on build Oct 13, 2017 bumpversion: stable version parsing, and docs Nov 22, 2017 move threading helpers out of compat module Nov 13, 2017
docker-compose.yml Add docker-compose for running sandbox environment Nov 18, 2017
pytest.ini docs for test-on-change, multiple py environments Sep 14, 2017
requirements-dev.txt Configuration for bumpversion Nov 22, 2017
requirements-docs.txt remove gevent & deprecated contract filter methods Nov 10, 2017 Bump version: 4.0.0-beta.1 → 4.0.0-beta.2 Nov 22, 2017
tox.ini Use the more concise tox syntax Nov 18, 2017

Join the chat at

Build Status

A Python implementation of web3.js

  • Python 3.5+ support

Read more in the documentation on ReadTheDocs. View the change log on Github.


import json
import web3

from web3 import Web3, HTTPProvider, TestRPCProvider
from solc import compile_source
from web3.contract import ConciseContract

# Solidity source code
contract_source_code = '''
pragma solidity ^0.4.0;

contract Greeter {
    string public greeting;

    function Greeter() {
        greeting = 'Hello';

    function setGreeting(string _greeting) public {
        greeting = _greeting;

    function greet() constant returns (string) {
        return greeting;

compiled_sol = compile_source(contract_source_code) # Compiled source code
contract_interface = compiled_sol['<stdin>:Greeter']

# instance
w3 = Web3(TestRPCProvider())

# Instantiate and deploy contract
contract = w3.eth.contract(contract_interface['abi'], bytecode=contract_interface['bin'])

# Get transaction hash from deployed contract
tx_hash = contract.deploy(transaction={'from': w3.eth.accounts[0], 'gas': 410000})

# Get tx receipt to get contract address
tx_receipt = w3.eth.getTransactionReceipt(tx_hash)
contract_address = tx_receipt['contractAddress']

# Contract instance in concise mode
contract_instance = w3.eth.contract(contract_interface['abi'], contract_address, ContractFactoryClass=ConciseContract)

# Getters + Setters for web3.eth.contract object
print('Contract value: {}'.format(contract_instance.greet()))
contract_instance.setGreeting('Nihao', transact={'from': w3.eth.accounts[0]})
print('Setting value to: Nihao')
print('Contract value: {}'.format(contract_instance.greet()))

Developer setup

If you would like to hack on, set up your dev environment with:

sudo apt-get install libssl-dev
# ^ This is for Debian-like systems. TODO: Add more platforms

git clone
virtualenv venv
. venv/bin/activate
pip install -r requirements-dev.txt
pip install -e .

For different environments, you can set up multiple virtualenvs, like:

Python 3

virtualenv -p python3 venvpy3
. venvpy3/bin/activate
pip install -r requirements-dev.txt
pip install -e .


virtualenv venvdocs
. venvdocs/bin/activate
pip install -r requirements-dev.txt
pip install -e .

Using Docker

If you would like to develop and test inside a docker environment, use the sandbox container provided in the docker-compose.yml file.

To start up the test environment, run:

docker-compose up -d

This will build a docker container set up with an environment to run the Python test code.

Note: This container does not have go-ethereum installed, so you cannot run the go-ethereum test suite.

To run the Python tests from your local machine:

docker-compose exec sandbox bash -c 'pytest -n 4 -f -k "not goethereum"'

You can run arbitrary commands inside the docker container by using the bash -c prefix.

docker-compose exec sandbox bash -c ''

Or, if you would like to just open a session to the container, run:

docker-compose exec sandbox bash

Testing Setup

During development, you might like to have tests run on every file save.

Show flake8 errors on file change:

# Test flake8
when-changed -r web3/ tests/ -c "clear; git diff HEAD^ | flake8 --diff"

You can use pytest-watch, running one for every python environment:

pip install pytest-watch

cd venv
ptw --onfail "notify-send -t 5000 'Test failure ⚠⚠⚠⚠⚠' 'python 3 test on failed'" ../tests ../web3

#in a new console
cd venvpy2
ptw --onfail "notify-send -t 5000 'Test failure ⚠⚠⚠⚠⚠' 'python 2 test on failed'" ../tests ../web3

Or, you can run multi-process tests in one command, but without color:

# in the project root:
py.test --numprocesses=4 --looponfail --maxfail=1
# the same thing, succinctly:
pytest -n 4 -f --maxfail=1

Release setup

For Debian-like systems:

apt install pandoc

To release a new version:

bumpversion $$VERSION_PART_TO_BUMP$$
git push && git push --tags
make release

How to bumpversion

The version format for this repo is {major}.{minor}.{patch} for stable, and {major}.{minor}.{patch}-{stage}.{devnum} for unstable (stage can be alpha or beta).

To issue the next version in line, use bumpversion and specify which part to bump, like bumpversion minor or bumpversion devnum.

If you are in a beta version, bumpversion stage will switch to a stable.

To issue an unstable version when the current version is stable, specify the new version explicitly, like bumpversion --new-version 4.0.0-alpha.1 devnum

You can’t perform that action at this time.