Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2382 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
: Z( f5 e5 f4 x( M: J7 J  C/ I) j1 I, p* G
$ _2 k9 T3 r: y8 l& M6 i
环境搭建5 {+ c; p2 y9 v; r; Z8 R, d
基于macOS或Ubuntu,windows用户请自备虚拟机。( N" A! D. k/ C) B  \' p6 V8 R
安装Docker及拉取镜像" _' d* I3 ?+ \6 S& @  O2 E
macOS:
4 d& p& Z$ |, ]& E1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态
" ^: \& H& g% w/ [3 k. U" j
% P8 v- H9 L' K2.拉取私链镜像,打开终端执行  ?) D7 I: s- v4 }. O) H+ o; z: w3 r
docker pull cityofzion/neo-privatenet0 H& [7 k; \) |0 s, G0 c' p4 }
0 Q2 U4 T3 s1 y0 r# V0 d
Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。
- S) A3 C7 w: o/ o- o; s" |3.运行Docker容器,执行
0 C& }8 t, z6 b  t( e( S" G% uUbuntu:
$ R+ v5 B1 z! ]9 ^- `1 Z/ d1.安装Docker,执行
+ j; k+ h1 S  m5 ysudo apt install docker.io
7 c- K$ ?) |: p9 l8 }2.启动Docker,执行(安装成功后应该会默认已启动)
% g3 e( l: G: v% C- @: [sudo service docker start- C) p4 N$ @% }+ K' w( a
3.拉取私有链网络镜像,执行
; L" t8 j, @+ X' T! I. Hsudo docker pull cityofzion/neo-privatenet4 b, l, G& w) L! b+ E0 E% q" e1 S
4.运行docker容器,执行
0 K. U6 T) l2 b+ v1 ^  v$ asudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet
4 K4 J% Q9 i: H7 |  ?! X安装Python3和levelDB4 J/ N/ H* m! E' X' B: _% Z9 a% O
macOS:8 H1 Y: w% t1 l5 U" I) \5 X4 `
没有安装过Homebrew的请先执行下面的命令,已安装的忽略。
" k' C- c1 N8 q" Q" n) G4 X2 S/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# Q2 d4 L* s& K6 v# C5 \1.macOS是自带Python2的,我们需要安装Python30 K  F; n+ {9 C) S! H9 G  |: d
brew install python3
' c. l; E! b( M6 ]* L: {2.安装levelDB, v' ~) F. C% v
brew install leveldb8 p% ~* {$ ]+ I9 J
Ubuntu:: U2 K& r4 @* W$ o- G' m" T1 |
简单粗暴的依次执行下面命令:& t& b  F8 b5 C+ |
sudo apt install software-properties-common python-software-properties
1 `9 h! \* j" Vsudo add-apt-repository ppa:deadsnakes/ppa
; }. w: j+ p" c& r; F& tsudo apt update
. T4 ?# R7 m4 f; ^( W, X& Ssudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++
- t) l  p0 D* E) ?- ]# ^Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。7 S& B7 J0 E! S' U1 T8 p( n$ u
neo-python
9 i6 |" h7 _8 v7 Y) j从GitHub克隆neo-python项目
$ w9 _/ U# X. g' r0 p8 q, Wgit clone https://github.com/CityOfZion/neo-python.git
' w8 z- M" Z  t8 x创建并进入虚拟环境
5 @+ |3 a1 @9 n8 d* C7 vcd neo-python" }9 ]/ _3 \. W6 A
python3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv
" o* G$ {; s) b2 f2 ^- ?) E. isource venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate# j# H, f+ v. I7 K
安装依赖包
9 L$ G1 d, D- mpip install -r requirements.txt; q+ q( {* @+ p5 G% e
pip install -e .6 F6 [8 E) g8 v/ @/ l
启动连接到私有链网络,进入NEO cli命令行
9 `3 c" T. c( k1 X  N. ?np-prompt -p # 退出命令行 在命令行输入 quit
  a9 |% D3 B6 X. V5 S5 ~& s! s% q' A2 o& N% ?
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。
* n/ y* V/ T4 ?6 @! jnp-prompt -p 可能出现的错误" B( k0 L2 f" v  \
错误一+ ~  H  z7 f1 n3 f1 \

4 Y' x. k& C1 @1 D. ^& R5 OTraceback (most recent call last):
6 g( a4 [( t2 v, ]+ F$ k  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
( V6 N# W  B; Z; }" ?; D9 Y    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
7 D. h  g% w( {; ?& [  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point; k( Z: T. Z+ @4 l5 ^
    return get_distribution(dist).load_entry_point(group, name)
& n+ u+ E" b) U0 N/ M  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
% |" r9 J7 w* A- ^    return ep.load()+ j7 t0 d9 n" S% G" h0 u! h9 a+ K
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load6 B1 v9 X: n# \, z2 I9 d+ y/ @
    return self.resolve()/ c/ p% y5 J" Y6 T8 \. V
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve8 U( E1 f% o# R! D8 b: U( t% M
    module = __import__(self.module_name, fromlist=['__name__'], level=0): I7 r* v" T( P5 |2 D7 K: ?
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
/ y1 V2 I2 m  O' {3 s    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
( K7 s6 t4 }* O: U+ K# L, Y  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in ) M) ^2 W! U) Y. P! d# H& L* x
    from neo.Wallets.Wallet import Wallet' f. L0 R! c* z9 H
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in
: p# p6 F6 u, e    from Crypto.Cipher import AES% P. k: M0 p$ O
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
+ ^  \5 h& `) X: t3 w: J    from Crypto.Cipher._mode_ecb import _create_ecb_cipher3 Y; X2 `' k9 z; V) x
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in
. a- c& `8 T) q( b    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
/ g% z9 C7 E/ J( n7 c  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in - h; b$ E8 A0 c- n! P# W( t
    from Crypto.Util.py3compat import byte_string! }+ h: V3 q7 c8 F
ImportError: cannot import name 'byte_string'9 o7 N& K* J. t" D. ]
这是因为依赖包的版本问题,解决方案如下! O0 `* X: v5 V2 }( |( Z
# 卸载依赖包7 m- \& V  A8 u- r: z4 Q# J
pip uninstall pycrypto% w5 `& ]( z) ^7 k; M
pip uninstall pycryptodemo
/ m  e/ [$ H+ P6 ~, I8 {- X# 重新安装依赖包+ `4 l: _8 b3 |  Q
pip install pycrypto
1 G8 F' o1 m* _  b- N8 bpip install pycryptodemo
3 ]  E7 ]* B, w- Gpip install -e .2 F' }/ `8 ]9 ]/ |. O8 h2 [5 n
错误二
, k# E7 f3 ^: v  w1 C......2 ?/ s# ?) Y' k8 A
Traceback (most recent call last):( v& l3 m$ E5 m- W! x, |
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in + v# }/ W8 M0 L! R
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
7 K& I' o* i3 L  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main" f7 E! ^2 [* T; R; R& k( a! m
    settings.setup_privnet(args.privnet)
1 [1 q2 d# v1 I  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
8 Y- ^' @5 F- E7 {( n    self.check_privatenet()
5 q2 x& s- |  l  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet
& g( @8 ?  [( Q  b, x* ]6 c    version = client.get_version()
$ B6 ]5 o# ]# O  p5 s$ Q4 z. N  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
9 S  W" @5 o( Y. ^5 f& G    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
* `( }% d8 V( {  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint! X) \; c. m+ \7 _
    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
& J8 m  G! X4 O* k1 r9 \! Q" K! Cneorpc.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',))5 g$ ~" }3 J: t0 u* W! |" c
说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2