Install and run Docker for Mac
Run docker-compose up --force-recreate --build -d
Get the container_id with docker ps -l
Create 1st Bash Terminal tab and run interactive Docker shell (for running Python script) with docker exec -it <container_id> bash
Create 2nd Bash Terminal tab and run interactive Docker shell (for TestRPC) with docker exec -it <container_id> bash
Create 3rd Bash Terminal tab and run interactive Docker shell (for cURL requests to API) with docker exec -it <container_id> bash
Start up the TestRPC in the 2nd Bash Terminal's Docker shell
rm -rf ./db;
mkdir -p db/chaindb;
testrpc --account '0x0000000000000000000000000000000000000000000000000000000000000001, 50002471238800000000000' \
--account '0x0000000000000000000000000000000000000000000000000000000000000002, 370004471238800000000000' \
--unlock '0x0000000000000000000000000000000000000000000000000000000000000001' \
--unlock '0x0000000000000000000000000000000000000000000000000000000000000002' \
--blocktime 0 \
--deterministic true \
--port 8545 \
--hostname localhost \
--gasPrice 20000000000 \
--gasLimit 0x47E7C4 \
--debug true \
--mem true \
--db './db/chaindb'
Run the Python script in the 1st Bash Terminal tab's Docker shell
python3 ./scripts/src/main.py
Run cURL request to simulate request to API from a front-end Client App in the 3rd Bash Terminal tab's Docker shell
curl -i 127.0.0.1:5000/api/v1.0/query?query=None&median_balance=True
Response containing median account balance
root@ed71f34ac199:/code# curl -i 127.0.0.1:5000/api/v1.0/query?query=None&median_balance=True
[1] 204
root@ed71f34ac199:/code# HTTP/1.0 200 OK
Content-Type: application/json
ContentType: application/json
Content-Length: 4264
Server: Werkzeug/0.12.2 Python/3.6.3
Date: Fri, 01 Dec 2017 20:42:28 GMT
{
"longest_chain": {
"block_count": 3,
"blocks": [
{
"accounts": [
{
"_address": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"_balance": 1000
},
{
"_address": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"_balance": 0
}
],
"block_hash": "0xfb00000000000000000000000000000000000000000000000000000000000000",
"created_at": "2017-12-01 20:42:14.61162",
"id": [
1
],
"parent_block_hash": "0x2d3816b0c954bf9495cf1eae723f73ae8c9f140622a07f5ba69f0897a8bae72a",
"transactions": [
{
"account_from": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"account_id": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"account_to": 5000,
"amount": "pending",
"probability_reverted": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"status": 0.5,
"tx_receipt": null
},
{
"account_from": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"account_id": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"account_to": 34000,
"amount": "pending",
"probability_reverted": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"status": 0.5,
"tx_receipt": null
}
]
},
{
"accounts": [
{
"_address": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"_balance": 1000
},
{
"_address": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"_balance": 0
}
],
"block_hash": "0x5a00000000000000000000000000000000000000000000000000000000000000",
"created_at": "2017-12-01 20:42:14.66245",
"id": [
2
],
"parent_block_hash": "0xfb00000000000000000000000000000000000000000000000000000000000000",
"transactions": [
{
"account_from": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"account_id": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"account_to": 5000,
"amount": "pending",
"probability_reverted": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"status": 0.5,
"tx_receipt": null
},
{
"account_from": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"account_id": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"account_to": 34000,
"amount": "pending",
"probability_reverted": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"status": 0.5,
"tx_receipt": null
}
]
},
{
"accounts": [
{
"_address": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"_balance": 1000
},
{
"_address": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"_balance": 0
}
],
"block_hash": "0x5100000000000000000000000000000000000000000000000000000000000000",
"created_at": "2017-12-01 20:42:14.75240",
"id": [
3
],
"parent_block_hash": "0x5a00000000000000000000000000000000000000000000000000000000000000",
"transactions": [
{
"account_from": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"account_id": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"account_to": 5000,
"amount": "pending",
"probability_reverted": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"status": 0.5,
"tx_receipt": null
},
{
"account_from": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"account_id": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
"account_to": 34000,
"amount": "pending",
"probability_reverted": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF",
"status": 0.5,
"tx_receipt": null
}
]
}
],
"median_account_balance": 1000
}
}
Run PyTest in Docker shell
python3 -m pytest .
Run Docker for Mac
Run Docker Container / Remove existing Docker network from image. Use Ubuntu packages listed at: https://packages.ubuntu.com/search?suite=all§ion=all&arch=any&keywords=solc&searchon=names
docker-compose down
docker-compose up --force-recreate --build -d
Open Docker sandbox session (Multiple tabs)
docker ps -l
# run interactive shell to the container
docker exec -it <container_id> bash
# create other interaction shells to the container (to run TestRPC)
docker exec -it <container_id> bash
Open Docker sandbox session (Single tab)
docker-compose exec sandbox bash
cat /proc/version
python3 --version
solc --help
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
populus
Run (Docker terminal tab 2)
rm -rf ./db;
mkdir -p db/chaindb;
testrpc --account '0x0000000000000000000000000000000000000000000000000000000000000001, 10002471238800000000000' \
--account '0x0000000000000000000000000000000000000000000000000000000000000002, 10004471238800000000000' \
--unlock '0x0000000000000000000000000000000000000000000000000000000000000001' \
--unlock '0x0000000000000000000000000000000000000000000000000000000000000002' \
--blocktime 0 \
--deterministic true \
--port 8545 \
--hostname localhost \
--gasPrice 20000000000 \
--gasLimit 0x47E7C4 \
--debug true \
--mem true \
--db './db/chaindb'
Run (Docker terminal tab 1)
python3 ./scripts/src/main.py
Other
python3 -m site
which /root/.py-solc/solc-v0.4.17/bin/solc
python3 -m solc.install v0.4.17
solc --bin -o $PWD/solcoutput dapp-bin=/usr/local/lib/dapp-bin contract.sol
Other Docker commands not necessary
docker network ps
docker network rm pyethfinality_default
IGNORE - Unsuccessful attempt to install Solc using Snap on Ubuntu 16.04 (or Snapd on Ubuntu 14.04).
apt-get install snapd
snap --help
ls /lib/systemd/system/snap*; echo; systemctl list-unit-files | grep snap; echo; dpkg -L snapd | grep systemd; echo; pgrep -a snap
Failed to get D-Bus connection: No connection to service manager.
and could not overcome it.
snap download solc
systemctl status snapd.service
systemctl enable snapd
service snap start
/usr/lib/snapd/snapd
ps -p 1 -o comm=
command: tail -f /dev/null
did not work either
command: /lib/systemd/systemd
solc --help
in the Docker VM.
ARG SOLC_VERSION=v0.4.18
RUN wget --quiet --output-document /usr/local/bin/solc https://github.com/ethereum/solidity/releases/download/${SOLC_VERSION}/solc-static-linux \
&& chmod a+x /usr/local/bin/solc
python3 -m pytest .
python3 -m pytest tests/
populus deploy --chain tester --no-wait-for-sync
Visual Studio (VS) Code
Setup - View Extensions - Press SHIFT+CMD+X
Compile Solidity Contract in VS Code - Press FN+F5
IntelliJ Debugging with breakpoints in Python
brew install python3
Setup Populus Framework - http://populus.readthedocs.io/en/latest/quickstart.html#debian-ubuntu-mint
pip3 install populus
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
populus init
populus compile
TODO - Testing with PyTest
TODO - Front-End with Truffle
Reference
Other References
Initially the approach was to try to create a Python application on macOS in Unix Bash without a virtual machine. I used the quick start code provided at https://github.com/pipermerriam/web3.py / https://pypi.python.org/pypi/web3/ to write main.py, and setup TestRPC code in a separate terminal window using a code snippet that I had previously prepared for another project (https://github.com/ltfschoen/solidity_test). The intention was to use Py-Solc as a wrapper for Solc.js in order to be able to use the Solidity compiler to compile the sample smart contract that was written in Solidity, but this did not work and I took drastic steps to try and make it work. Web3.py would then deploy it to the TestRPC blockchain. Unfortunately I encountered errors, so I decided to try to use a virtual machine with Docker instead. If you happen to know how to overcome the error I would be grateful if you would please create an Issue and explain it.
Setup PyEnv - https://github.com/pyenv/pyenv#homebrew-on-mac-os-x
Add the following to ~/.bash_profile and then run source ~/.bash_profile
.
export PATH="/Users/username/.pyenv:$PATH"
eval "$(pyenv init -)"
Install PyEnv
brew update
brew install pyenv
pyenv --help
pyenv install 3.6.3
pyenv local 3.6.3
Setup PyEthereum
About
eth-testrpc
to work.Install dependencies - https://github.com/ethereum/pyethereum/wiki/Developer-Notes
brew install pkg-config libffi autoconf automake libtool openssl
Clone repo
git clone https://github.com/ethereum/pyethereum/
cd pyethereum
Avoid error https://github.com/ethereum/pyethapp/issues/209 scrypt-1.2.0/libcperciva/crypto/crypto_aes.c:6:10: fatal error: 'openssl/aes.h' file not found
brew update
brew upgrade openssl
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
env LDFLAGS="-L$(brew --prefix openssl)/lib" CFLAGS="-I$(brew --prefix openssl)/include" pip install cryptography
Install PyEthereum dependencies
python setup.py install
Setup Test Network for blockchain in new Unix Terminal Tab
pip install eth-testrpc;
rm -rf ./db;
mkdir -p db/chaindb;
testrpc --db './db/chaindb'
Back-end
Web3.py - http://web3py.readthedocs.io/en/latest/quickstart.html
pip install web3
Solidity Compiler
Install Solc.js - https://github.com/ethereum/solc-js#usage-on-the-command-line
npm install -g solc
solcjs --version
Error 1.01 - Fix error when run main.py due to this line compile_source(contract_source_code)
that results in error: FileNotFoundError: [Errno 2] No such file or directory: 'solc': 'solc'
:
cp /Users/Ls/.nvm/versions/node/v8.7.0/bin/solcjs /Users/Ls/.nvm/versions/node/v8.7.0/bin/solc
solc --version
Error 1.02 - Fix error when run main.py (after fixing Error 1.01) due to this line compile_source(contract_source_code)
that results in error: Error: Cannot find module 'fs-extra' ... /Users/Ls/.nvm/versions/node/v8.7.0/bin/solc:6:10
solc
executable to the solcjs
that is installed in the NPM dependencies:
ln -sF /Users/Ls/.nvm/versions/node/v8.7.0/lib/node_modules/solc/solcjs /Users/Ls/.nvm/versions/node/v8.7.0/bin/solc
Install Py-Solc (to be used by Python as a Wrapper for Solc.js)
pip install py-solc
Create Python program in main.py
Run Python CLI to experiment. Use the Simple Example in the Web3.py documentation
Run Python program
python ./scripts/src/main.py
Troubleshooting
Traceback (most recent call last):
File "main.py", line 28, in <module>
compiled_sol = compile_source(contract_source_code)
File "/Users/Ls/.pyenv/versions/3.6.3/lib/python3.6/site-packages/solc/main.py", line 106, in compile_source
stdoutdata, stderrdata, command, proc = solc_wrapper(**compiler_kwargs)
File "/Users/Ls/.pyenv/versions/3.6.3/lib/python3.6/site-packages/solc/utils/string.py", line 85, in inner
return force_obj_to_text(fn(*args, **kwargs))
File "/Users/Ls/.pyenv/versions/3.6.3/lib/python3.6/site-packages/solc/wrapper.py", line 165, in solc_wrapper
stderr_data=stderrdata,
solc.exceptions.SolcError: An error occurred during execution
> command: `solc --combined-json abi,asm,ast,bin,bin-runtime,clone-bin,devdoc,interface,opcodes,userdoc`
> return code: `1`
> stderr:
> stdout:
Must provide a file