Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2450 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
: O, F1 H. |; P8 }) g; T% w3 R- u. Y

0 _' ^. Y$ c* i3 t1 d! y环境搭建! [8 d% I( L1 F: z: j; E
基于macOS或Ubuntu,windows用户请自备虚拟机。
! ^& e3 y0 u2 b1 Z3 Z8 W! S. H' e安装Docker及拉取镜像
+ X4 \0 \* ?& y" G  ^macOS:4 K" B, g9 N% D. ^! Q1 L) @6 j
1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态+ K" F! x8 j1 N! |1 A
( F& e/ ?8 T3 K, I/ N6 @
2.拉取私链镜像,打开终端执行( x3 f  H8 X5 N' {4 f
docker pull cityofzion/neo-privatenet! x" t6 }3 b. p+ I8 s

: w* \) l9 q! l$ \Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。2 d  _+ m6 @# f" R) x
3.运行Docker容器,执行& o& n' }1 W4 G. _, }  H4 e
Ubuntu:
  B) L1 \! ~2 d' }- y1.安装Docker,执行
) h6 t) ?, F9 @; m' Xsudo apt install docker.io3 a# I& E4 y+ X  A, t
2.启动Docker,执行(安装成功后应该会默认已启动)) c' D' G% y" P* R( ]
sudo service docker start
, Y9 _3 k8 E5 ~! m2 X3.拉取私有链网络镜像,执行* q3 K4 d, U) D0 R
sudo docker pull cityofzion/neo-privatenet( b! R7 ^& y( E2 T
4.运行docker容器,执行
, y: ?: o+ g8 B  Q3 z/ X% gsudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet' B" u& ^  W' T! T: j, L
安装Python3和levelDB
# u! o: R+ ^+ S- hmacOS:
+ l& ~* _+ i% V8 i# L$ M没有安装过Homebrew的请先执行下面的命令,已安装的忽略。
0 K* R1 b* B6 p8 ?/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
9 \' m! w2 q0 n. q* X7 C1.macOS是自带Python2的,我们需要安装Python3
- s2 M5 }. n- E# e% Kbrew install python3
* X! e$ i: y7 G# ?9 c5 v2.安装levelDB9 Z& ^! G, M3 O# a% ?$ W
brew install leveldb: U. x! U& |) y2 P+ F
Ubuntu:
1 O8 E- F  }1 z" ^" r% F简单粗暴的依次执行下面命令:
( ~) H+ v! o# isudo apt install software-properties-common python-software-properties
" m, e1 P# Q  F( f$ rsudo add-apt-repository ppa:deadsnakes/ppa
. z- t* J$ p& X) V1 r& nsudo apt update
$ A8 @7 V6 J" G1 B" O, P, Osudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++
! j5 q' _' {" O  ?8 l6 |/ \- v) g3 GTip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。$ s* _$ D  U5 U# {% q# F9 U* e, R
neo-python2 ^- H# Q1 c. s* a. Q
从GitHub克隆neo-python项目/ p' G; {' S* r+ c( _9 z
git clone https://github.com/CityOfZion/neo-python.git4 R7 W' x) m0 |- N0 F: J8 D% y
创建并进入虚拟环境
, j$ W  F) L! ~$ f' s' Hcd neo-python
4 h* U8 h2 `+ K( m+ N" p7 `python3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv. y( }% J0 y$ W9 m, \4 i
source venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate
- `7 _# D: S# m  [) Y安装依赖包; m2 c* h5 T4 [/ b
pip install -r requirements.txt1 |- K3 x1 W* R" i: @" H8 I* D- z2 n! a
pip install -e .
1 b! I! J' E: `7 n/ b* y启动连接到私有链网络,进入NEO cli命令行
, r) d' _: v8 [- T  hnp-prompt -p # 退出命令行 在命令行输入 quit9 |. H( h7 O6 R. h" |
+ ?( Y4 w+ m3 Z1 t3 `: F$ b
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。/ i5 e' I7 ~* }
np-prompt -p 可能出现的错误
5 d4 l1 w; b* ]. b( a! b1 o% Q- M# D错误一: J+ \1 L7 o! P7 @# I+ U

* \& t3 T, a% j9 R& L0 o' wTraceback (most recent call last):) M6 _! o. N# Y  S, O4 b
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
! x% }: F- f. i4 m# l    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
& f0 b3 A6 a& c0 L  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point/ v" @* j5 c# t7 D$ P, j
    return get_distribution(dist).load_entry_point(group, name)! t! A1 e0 P/ Q
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
! v2 p, W2 e' n8 O( S7 i8 z7 K) G    return ep.load()
* _1 @# V6 c6 i  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load3 y/ ~. \- y* t9 q
    return self.resolve()' {/ }$ d: Z) o- `# @* n' h
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
5 q/ N) t! N0 V# O7 U    module = __import__(self.module_name, fromlist=['__name__'], level=0)# m1 |$ m. A8 B
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
* P: G+ I$ X3 M5 Q; R& K! U( N    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
  |! B: N9 `; q, X  h  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in # ~$ t1 H' R/ v$ [) E: ]
    from neo.Wallets.Wallet import Wallet
+ G. x) x$ k, |9 h2 m! r  ?  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in
( D& x3 g* B/ Y7 I; {5 K3 j    from Crypto.Cipher import AES
. v+ ^3 f( q7 x) q/ L8 ~  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in , Q+ y3 b5 e4 H( W/ q
    from Crypto.Cipher._mode_ecb import _create_ecb_cipher
( A9 y" h1 }/ t$ b9 ^: R  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in
( H; C0 x4 A" Q  n- h1 m0 c6 c6 E) q    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,8 x) s" Y" m- H: w8 W8 q' \
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in
. j# A6 W% q& ]$ L0 Q0 W5 M    from Crypto.Util.py3compat import byte_string
3 S' c9 B' }: G: P  v" n) LImportError: cannot import name 'byte_string'6 @; y2 ~. p; [$ D- D
这是因为依赖包的版本问题,解决方案如下
7 Y  a* X1 X& K7 m! \# 卸载依赖包
/ O0 q/ A; |& y( Apip uninstall pycrypto
( f. J$ w" l/ n" T6 H, zpip uninstall pycryptodemo# N( s% E2 j. j% [2 u  `9 F$ |- |
# 重新安装依赖包
8 J2 d' m. d3 U: v! o; w  k: Npip install pycrypto- a( D+ B- F! f1 T
pip install pycryptodemo
- _& U2 t0 E- ^8 z' l, [% {pip install -e .- F# N5 a0 W8 z6 p; d
错误二3 y) M  D1 {4 I0 @
......! T$ ?5 i4 p7 U* o$ V
Traceback (most recent call last):" G- U5 U7 k4 }! y) c5 H; d( W
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
" ?7 A( r% I+ F    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()( p. H: y3 }$ T# L: B
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main, S6 Y; d5 d; t% b
    settings.setup_privnet(args.privnet)3 a% p$ j& f/ \: C5 R
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
- m9 m/ j7 W1 E. r  q    self.check_privatenet()
% N% e! E3 r9 v8 E( Y' R  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet/ f6 ?+ j. F% z" Z! K2 u/ _' P
    version = client.get_version()
3 r) t+ G& V- o' o: z3 ]  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version7 [7 g7 B( L2 I; L
    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
; O% R: I2 T9 |- O  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
# e9 B# i# h# y3 ~; s    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
$ f& f; `/ Q2 b7 m3 l2 Q% xneorpc.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',))
1 E# [( @, j3 D5 s+ }6 k) ?0 n说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2