Python也可以编写智能合约:从NEO开始
天道唯
发表于 2022-11-26 14:50:19
2381
0
0
* g1 b$ O B2 _8 Z0 Y4 U+ ]1 P" |1 v
环境搭建! {; }. q7 ~: j( g7 e) }* j% P5 t
基于macOS或Ubuntu,windows用户请自备虚拟机。
安装Docker及拉取镜像
macOS:" G3 a0 Y9 I4 I( D% |
1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态/ g) T1 \# W# w. O. Q% R
2.拉取私链镜像,打开终端执行
docker pull cityofzion/neo-privatenet
Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。6 n. M* |8 T7 M: X, x" U
3.运行Docker容器,执行
Ubuntu:4 {. N8 @; x: V* H `; p4 M" m
1.安装Docker,执行
sudo apt install docker.io
2.启动Docker,执行(安装成功后应该会默认已启动)& U) M) {. @) O# t7 j+ \
sudo service docker start0 @8 C( ]/ o- H: X" ^2 ~ C( {" g
3.拉取私有链网络镜像,执行# ~: Z! p C6 q/ E3 G
sudo docker pull cityofzion/neo-privatenet
4.运行docker容器,执行5 i6 K9 u* M- x% i. ]& f
sudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet3 v# o7 p g5 N2 c5 ]( D
安装Python3和levelDB
macOS:
没有安装过Homebrew的请先执行下面的命令,已安装的忽略。7 X9 W2 o" d0 K1 Y; }3 F& }
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
1.macOS是自带Python2的,我们需要安装Python34 ~4 V- g% `0 j$ ^ K
brew install python3
2.安装levelDB
brew install leveldb2 Q- K7 D: i. R& D
Ubuntu:; h* S d. t( {5 k5 g
简单粗暴的依次执行下面命令:
sudo apt install software-properties-common python-software-properties
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++* |, w; M5 [- j; O
Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。: f9 C" S, M: m" ^% _/ P
neo-python3 ~8 f& A) k( F9 l& @. S6 ^+ P
从GitHub克隆neo-python项目! M8 l2 [% t( b
git clone https://github.com/CityOfZion/neo-python.git+ C" R+ E& w2 _* }8 [' `
创建并进入虚拟环境
cd neo-python; @) z: B: h2 i: B+ I7 W
python3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv# ?+ ~1 [' O0 b/ f
source venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate
安装依赖包
pip install -r requirements.txt
pip install -e .; D5 `' Q- j( |: `/ o# \
启动连接到私有链网络,进入NEO cli命令行
np-prompt -p # 退出命令行 在命令行输入 quit0 w! ]% d, N" p' M; q2 i
( j+ [1 J F4 K
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。
np-prompt -p 可能出现的错误
错误一; q% |7 X' y. Y& i0 y! O- K0 ~! j
Traceback (most recent call last):! f5 U B j1 n* l9 j
File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
load_entry_point('neo-python', 'console_scripts', 'np-prompt')(); M: g% g' f a I$ r8 |
File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
return ep.load()
File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
return self.resolve(): t$ y9 q" M6 X6 ~) a/ G/ Q. F* X5 b
File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve4 j+ L) i6 ]: z" a' ]8 n. c6 H
module = __import__(self.module_name, fromlist=['__name__'], level=0)0 W6 O2 Y2 E# I8 L) L. I- {4 a
File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in
from neo.Wallets.Wallet import Wallet' k$ I! J& M- x5 k4 R: D
File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in 0 T6 H& i* _5 P8 d; e
from Crypto.Cipher import AES* b4 G; o4 r' R
File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
from Crypto.Cipher._mode_ecb import _create_ecb_cipher4 A: [) `" L& `% W" f& \
File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in
from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in , E! a4 [; d. h \9 e0 q
from Crypto.Util.py3compat import byte_string8 {8 \; J. W' A& p- A4 I; j
ImportError: cannot import name 'byte_string'
这是因为依赖包的版本问题,解决方案如下
# 卸载依赖包& N$ z1 w! A: |, ^6 l& x6 O- x
pip uninstall pycrypto9 @' z# r4 a2 [# t/ S9 b. F8 g
pip uninstall pycryptodemo0 n$ M7 q! O3 D3 }) t' d- W& T
# 重新安装依赖包+ ]+ U/ F/ h% H0 O- x5 K
pip install pycrypto) q( k4 @2 H& m7 [
pip install pycryptodemo
pip install -e .
错误二
......
Traceback (most recent call last):0 D$ ]9 h7 a0 Z8 A' h( I9 A, C7 q8 X
File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in ! R: ]# x1 M' N6 ]0 d& P
load_entry_point('neo-python', 'console_scripts', 'np-prompt')() e/ v+ T" @5 x% }
File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main. `1 U, n) ^6 W8 n
settings.setup_privnet(args.privnet)( h# r" f. H" Y- |
File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
self.check_privatenet()+ |( H( c( v( w
File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet7 ^# b- r3 y9 E9 Q" ?5 O
version = client.get_version()6 ^- j7 F2 }9 z8 }- q
File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)9 |1 j. p0 F% `2 @5 E1 v
File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint( o3 W8 ^4 L: k
raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
neorpc.Client.NEORPCException: Could not call method getversion with endpoint: http://127.0.0.1:30333 : HTTPConnectionPool(host='127.0.0.1', port=30333): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused',))0 d; g" v3 l( w
说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
成为第一个吐槽的人