Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

Python也可以编写智能合约:从NEO开始

天道唯
2379 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。/ C1 s: p/ J( \* r
3 P# z2 K' T' t* s" h" J+ \- O1 p

: q6 M4 S2 P; J' F, e. ~, V2 m8 G环境搭建" i  T2 T6 T1 x1 C# ]1 x
基于macOS或Ubuntu,windows用户请自备虚拟机。
0 e) d4 `9 S+ J) T安装Docker及拉取镜像0 |+ L: Z& X& `0 K* ~! ]
macOS:
" W* `& u7 o. P1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态& Y7 v3 x, @; a

$ r9 _# j1 m* V1 d2.拉取私链镜像,打开终端执行
# {# G/ R6 V# r. x4 _; Cdocker pull cityofzion/neo-privatenet
7 b7 \2 o) {1 r: B+ N4 N6 H& E* \  y, G
Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。2 r; P) e8 v" M, [. K! P
3.运行Docker容器,执行: T/ y9 {. V2 H; }& ~
Ubuntu:
7 Q8 Z* o/ @  H; l1.安装Docker,执行: ]9 O5 A1 v/ J0 y
sudo apt install docker.io/ A6 M- @, D9 B( m
2.启动Docker,执行(安装成功后应该会默认已启动)* M4 `' |! q5 M5 K9 Q3 T
sudo service docker start
0 @& A4 s# S# Y( `3 B3.拉取私有链网络镜像,执行8 r. f1 x1 ]* {9 E# v+ H7 O) U9 r
sudo docker pull cityofzion/neo-privatenet
# d: S, `- s# H. \1 A& `/ @4.运行docker容器,执行
/ Z' O" \8 j' {; l/ tsudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet
, t3 O* C) @8 |0 f" X# \# U7 V安装Python3和levelDB
9 n0 u7 N- i/ d9 kmacOS:0 s/ n! ^1 v. i1 E3 Y& P9 V
没有安装过Homebrew的请先执行下面的命令,已安装的忽略。# \( |2 a$ A1 ?6 `* k7 y& [
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"; D: D6 H, l2 W4 @" c# v
1.macOS是自带Python2的,我们需要安装Python3
6 P% d- }- D9 a5 nbrew install python3( d1 ]) o! Y# R6 g* u; \  s, g
2.安装levelDB
: U8 x* t+ l- Wbrew install leveldb: \2 k8 `4 S& n$ l* K+ R1 f
Ubuntu:! S/ g/ ?: Q5 R/ a5 K5 @" W
简单粗暴的依次执行下面命令:' X1 x: L5 h" g
sudo apt install software-properties-common python-software-properties1 v8 y  i. j  Q5 l8 j
sudo add-apt-repository ppa:deadsnakes/ppa! \0 w, x, X, o: V
sudo apt update
5 j' V  `8 r: _sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++
3 ]4 H3 W3 w0 K. Q1 ~9 M0 [Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。4 G; A. O/ f) M0 ]9 o# J
neo-python  v' I" Y" F+ |: }2 I, A
从GitHub克隆neo-python项目3 ^( ?( J5 v4 [4 |0 M
git clone https://github.com/CityOfZion/neo-python.git7 p1 i0 o; [- ~+ c, y9 b$ Z' O7 t
创建并进入虚拟环境
* S, D0 }$ P* q6 B7 }% Qcd neo-python, e8 e8 @+ B3 t- ?
python3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv: {/ d: Q/ }. L, n% z% _5 G+ y
source venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate
# x2 c' F' p9 m* E安装依赖包
. a0 R2 p# \' g8 |8 ~pip install -r requirements.txt3 S+ u+ R1 D( K, o2 L
pip install -e .
' F8 I$ ?. c9 |# z* W启动连接到私有链网络,进入NEO cli命令行! z8 i" N6 I! j8 y/ ~. r3 Q
np-prompt -p # 退出命令行 在命令行输入 quit+ B; M& m, n+ R' \. d! c% k: j

, T4 ^- S8 T6 _. m) Q% D/ Y2 w出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。- [9 t6 c7 B$ ~2 g  b& a% c6 P* u
np-prompt -p 可能出现的错误
# Q4 P0 {  |2 R' }0 i! ?  U错误一' s9 x% n! O0 I( O! J; L( Y

8 i  N8 _6 t4 r' {7 B* _- l8 b/ F$ RTraceback (most recent call last):
) ~9 d  O$ E; s3 ?6 B; ]  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in . z9 W/ C, K( W1 w5 s
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
7 Z- Q# z, ~# I( R  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
1 _' r( D, Y+ Q$ U) t    return get_distribution(dist).load_entry_point(group, name)
, |8 n: g+ }+ d  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
8 K/ u) E3 L$ S6 F* H    return ep.load()
& q0 C" Y3 o, Y' l0 J  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
* N+ {" J& q5 J3 O+ f    return self.resolve()
; `4 F1 S- ]5 W2 H& Y/ f: b8 J  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
1 d. N2 E) g0 J! j- ]: e' S- K    module = __import__(self.module_name, fromlist=['__name__'], level=0)5 ]5 v9 x# L0 `0 h
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
9 E0 ]" p; \6 ]/ E  `- `1 U    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
& ~$ m9 y3 \  ?+ f8 m  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in
' ]. A# l- v. B5 {) @. ~' H% K# ~6 a    from neo.Wallets.Wallet import Wallet3 V% n- s* o/ |% ?
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in
" t( R- B$ b* T- l( e$ e    from Crypto.Cipher import AES
* k- d1 a' `) ?" j: f  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in ) \# H1 e. h' i2 V
    from Crypto.Cipher._mode_ecb import _create_ecb_cipher" j" Q3 c0 }& r/ _
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in ' m& T' w) c' T
    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,5 i' O4 L) w1 i* p1 q# R6 \
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in ! c& @6 J$ g9 E6 I  _3 J
    from Crypto.Util.py3compat import byte_string
2 X8 ]6 I7 p! x9 G% w# ?ImportError: cannot import name 'byte_string') M" K8 h6 p# M( d+ ?( x
这是因为依赖包的版本问题,解决方案如下
" m  T) H, l8 q5 I  Z, ~4 Z( z1 O# 卸载依赖包
- B# i' O1 d/ r% M: s+ |pip uninstall pycrypto
7 M3 Y8 u3 n; o  n, {* Tpip uninstall pycryptodemo) A- z8 p2 ~& q, O  J6 p( F
# 重新安装依赖包- ?5 a* N2 X4 D9 Z/ a  }
pip install pycrypto/ H6 z; D1 z  U) Q  H* `$ T
pip install pycryptodemo0 H! o) R0 J  l. U1 c
pip install -e .& K. [0 Y/ K" {! ^5 `! |, j. f
错误二9 I2 \- [/ \* ~4 f% S1 _" l: `  Q
......
9 Z, N3 b; b( [) B. j5 MTraceback (most recent call last):8 d' N! b1 Y7 o  D
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
  n9 a: Q5 f; X! |0 V4 y2 j    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()( K6 n; n- S. N1 A4 `+ W8 X0 }  Q
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main! T: g) g, h% d! I8 s2 g) A
    settings.setup_privnet(args.privnet)3 m* Y  W% C# P3 D5 Z
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
$ |4 i, z* d9 t) ~- M) z; K    self.check_privatenet()
1 ~4 V# W; ?( s% M$ [" ]- M  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet* L; n; I  ?' N6 D; m7 t7 [
    version = client.get_version()9 t7 t! J3 z# c+ y" D' |
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version$ W2 g: }' j( M, @8 y: R
    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
  e( j+ L3 a7 y9 E6 Q  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint1 t# b: u# p# z5 w
    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))+ R9 ~; \5 `1 `9 h! H& n6 Q' q+ c
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',))
. e" K/ g- l( i9 o说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2