Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2455 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
4 g# o. A, r! l; ?
1 B0 ?; _$ X- M+ K3 w. q7 k; l1 u
7 I: S4 u( @1 x9 j$ e. \& o7 Q环境搭建
: t7 k  M" w: I4 I! I/ j) i基于macOS或Ubuntu,windows用户请自备虚拟机。
' k2 P/ b( x" C; Q% W2 V安装Docker及拉取镜像
7 e" g' R, s/ OmacOS:
  ^/ P1 |- f0 w$ g7 ?1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态% v* P7 o8 k% }8 u. {& x1 Q
7 i# }% S7 h+ V7 d( I
2.拉取私链镜像,打开终端执行
* C/ Z# ]5 F9 {' X' Gdocker pull cityofzion/neo-privatenet/ p% O& C! A+ C$ j+ |$ P) |
" T; W6 K0 R+ z. R& Z6 O; G# g
Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。0 S2 s; Y! H, ?
3.运行Docker容器,执行) d7 R. w' |2 Z
Ubuntu:* E9 K- p/ V  ]) ?0 {0 X
1.安装Docker,执行
$ h2 i1 {1 L" `1 t" Hsudo apt install docker.io
. E! y# |# U! P2.启动Docker,执行(安装成功后应该会默认已启动)
1 t' d: i( g) @. usudo service docker start/ N/ A; M) [3 R0 w: U, e
3.拉取私有链网络镜像,执行' n0 S8 X! J, T, L* Y6 U
sudo docker pull cityofzion/neo-privatenet4 `' x5 i0 ^- X+ Y5 B0 T
4.运行docker容器,执行/ c# d- ?' y& _! V& z8 x
sudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet; G+ I7 Y+ i8 |: f) F
安装Python3和levelDB- Y' D, D3 h- F
macOS:7 ]& ]. b1 T8 \# v( \
没有安装过Homebrew的请先执行下面的命令,已安装的忽略。
) W- s4 R2 a' I2 ?3 J; `: l$ y/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"7 E! x) O6 V7 `& ?1 m
1.macOS是自带Python2的,我们需要安装Python3
8 G% g9 b6 a% p5 M+ bbrew install python3
9 W1 U, P: l8 A" R4 r2 r2.安装levelDB
& w7 _' m0 n% R' Ubrew install leveldb
6 y1 e5 K- W" e. r* g: k/ s9 ]Ubuntu:7 L; r; ^! A' B6 E0 A* L
简单粗暴的依次执行下面命令:! M( h* z% F6 G
sudo apt install software-properties-common python-software-properties; C7 h5 F6 Z5 k" r
sudo add-apt-repository ppa:deadsnakes/ppa3 j+ v1 `8 }5 f9 b! f& v7 u
sudo apt update  s  S! M* c6 h* [7 T
sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++% e- m5 a$ J( O( V! U; R  i
Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。) c6 Y; Z7 r% Q0 ]6 X  N' V
neo-python
7 A5 f+ Z$ U4 o" l1 I1 m; C从GitHub克隆neo-python项目
) Z% Q& k0 W; g3 \! H! Qgit clone https://github.com/CityOfZion/neo-python.git
# h3 }+ P7 P/ x  `2 g# B创建并进入虚拟环境- H/ z, u( G) d0 f1 j' p4 R4 I
cd neo-python
8 z0 w3 v: m+ w8 A' q! @( @& p1 G. Qpython3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv
) U: d8 g$ ?/ v) _, }+ X6 Y1 Qsource venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate* ]- k2 H1 n/ T* p( N, H$ c
安装依赖包7 @. `9 A1 N0 T: {- v
pip install -r requirements.txt: O' i; z; J8 T* H& H
pip install -e .0 @( [3 l; R; i
启动连接到私有链网络,进入NEO cli命令行
% @6 C; f- z1 J5 c3 y+ @np-prompt -p # 退出命令行 在命令行输入 quit* ~' @: x* ]  M' @: V8 `
0 K- b3 z$ G8 L$ E+ L
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。0 a1 y+ n; @( }
np-prompt -p 可能出现的错误
! [/ D1 f8 [. T' I, R7 X错误一: Q0 E2 @, ]6 t6 B
, O# Z( v% s7 `" q
Traceback (most recent call last):
2 }4 d# ~# _$ U) B3 I& U# v3 U  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in 4 E6 I1 Z( i# Y
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()2 J# Y& B# i0 e
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
  p2 y8 x5 b% Y4 p9 y5 h$ q  l    return get_distribution(dist).load_entry_point(group, name)
0 e; Q3 e0 n, r. c' h% H8 L  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
9 s" H% w9 o6 D9 ]$ f& L$ ^' O    return ep.load()7 E% _! j; ~, x' G) t- D* Y- x
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
, @( L3 p; I2 {5 e( @- G5 [    return self.resolve()" E" U% E4 W9 {2 @' M: r
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
1 {* `/ h3 s3 i) Z    module = __import__(self.module_name, fromlist=['__name__'], level=0)/ f  A3 h$ `/ Z0 k5 c+ B
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in & j7 j8 w# Q( m8 c* G3 \3 x. z
    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet. \0 |" i1 P! ^9 O8 D/ t( g
  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in 0 E% I( R  z# G5 S5 y7 D) b
    from neo.Wallets.Wallet import Wallet7 {+ k8 h( Z# _7 D% s3 g- z
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in ' ]0 m0 f/ J& b# N( M; h$ s
    from Crypto.Cipher import AES
; ^# U& i3 c( f+ ^; @0 \  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in ; @0 W1 V* L0 ]" m7 d2 n' n5 |
    from Crypto.Cipher._mode_ecb import _create_ecb_cipher! v$ A1 T4 a8 f6 W' \( v) ~5 Q8 A
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in " F; {/ o3 ~5 ~7 E5 `
    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
2 D1 f6 ^1 i) N* g  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in 7 ?* D& [5 u. g* P  ^! `
    from Crypto.Util.py3compat import byte_string
' Q3 ]" _) m8 E, D' LImportError: cannot import name 'byte_string'
2 _! j6 e1 }$ V  O% p5 }8 `$ N6 `这是因为依赖包的版本问题,解决方案如下, T1 [+ Y' S& j+ {/ |
# 卸载依赖包, `. M" O$ q0 A6 {
pip uninstall pycrypto
4 V% S/ D, V$ ppip uninstall pycryptodemo* R- z: I5 ~3 ?# ~1 N  a( I  S# u
# 重新安装依赖包
( t3 l# n1 C0 D+ X+ s  i) cpip install pycrypto
1 X7 S0 y' W4 @7 U- Fpip install pycryptodemo
5 B+ k& }6 {4 m/ n5 z, tpip install -e .
2 [; g( }2 j; A* t! f错误二- b. v+ ]4 B# ~  _
......
$ ~2 A% s  m4 }& t- V1 D3 WTraceback (most recent call last):
& K4 Y, f% N: ^. C! K  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
* V- X% N! |# ?2 r' ^% V3 T    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
; h% s9 _/ v- k$ T, m  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main
% g8 _# Q# Z: V8 \$ N9 w    settings.setup_privnet(args.privnet)+ |4 H$ ~% ?& E- l- }5 b1 c  l
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet( F& j$ P1 N5 Z0 r# B- J' i7 G# ]
    self.check_privatenet()
& q; J& b( Y3 M6 n& q' `  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet' h0 Y& A) E% D( g- W3 V' g) e
    version = client.get_version()
0 D6 d8 i- f* e  {  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version& W) |, ^; L$ d' T! t& Y8 x7 D
    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
2 G* m# v4 E6 v1 Y- x  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
6 p5 `- P: F% {! m    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
: P6 X/ _9 J' c- Q* h+ Aneorpc.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',))
. C: a0 i0 z  U3 t0 M; f# V说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2