Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2448 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
4 A6 q; G6 s1 x9 M+ o4 {6 Z" L4 [$ v* }: f
% d" @8 h: m, p; m
环境搭建5 n* J% G: E' q6 U) e0 H
基于macOS或Ubuntu,windows用户请自备虚拟机。
5 i( E# c# r# t/ e安装Docker及拉取镜像
! I# C- \  [1 S6 p* YmacOS:
, j7 `9 e+ I& P* m/ _+ r1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态/ h! F9 O- A9 `6 U+ ], K8 q
2 W" ]' B" A" u# {0 ^+ C- Y2 V6 L3 I
2.拉取私链镜像,打开终端执行
2 }' `# i3 B1 }+ K2 F0 h# l$ pdocker pull cityofzion/neo-privatenet3 x- ]! @# |" }

/ o) |9 Q) c! ~/ l+ pTip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。3 G: b( H  w+ m% b; _; T5 A2 G
3.运行Docker容器,执行5 ]  L: R, G7 @. |
Ubuntu:
* j1 {* E" c  Y% A$ n: F1.安装Docker,执行/ }0 H/ u( x# ~# V7 v1 V# c% E
sudo apt install docker.io5 L/ e$ r* q( }/ h3 _* E# k# @
2.启动Docker,执行(安装成功后应该会默认已启动)- I' x6 z- x; O" f+ J( U/ S
sudo service docker start
( \$ T( m0 `; o/ o3.拉取私有链网络镜像,执行0 k; a  B3 L" x' C$ Y% a) t
sudo docker pull cityofzion/neo-privatenet
  L" h. g0 Q7 l. e" M; R5 C' ^4.运行docker容器,执行5 c: I' K5 p4 _. k0 |
sudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet+ [! F9 P- P4 ]" Q, ~" m: U: g
安装Python3和levelDB8 s: A' W9 ~' i& q- G+ f6 J/ p
macOS:9 r! S& I/ C, s. }0 E
没有安装过Homebrew的请先执行下面的命令,已安装的忽略。2 q/ j! P) @! Z: n+ g$ u
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
0 g3 B, M( D) i/ n0 P1 X5 C1.macOS是自带Python2的,我们需要安装Python38 z& [: l, u! R. w! l3 N* Y
brew install python35 s1 K$ R9 q+ r+ d) {' u+ `4 _7 O; @
2.安装levelDB. X2 M% o$ V" F( `2 r; l4 `6 ~
brew install leveldb2 [$ f3 Q4 c2 p  K
Ubuntu:
% B' J% n% L. Q6 O4 T. o( z简单粗暴的依次执行下面命令:
/ r, B6 }; a! tsudo apt install software-properties-common python-software-properties
: r" p4 v; f) E6 E6 p! gsudo add-apt-repository ppa:deadsnakes/ppa8 J: {  G9 Q+ B8 ?  F
sudo apt update* s" T; _& _1 V+ g& z% f
sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++
! c  P" b2 H* zTip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。, \9 X: e! V" v! `' l) B! R, |' ^
neo-python
' j, w9 I9 j: I+ L从GitHub克隆neo-python项目# C$ x$ Q* B, N3 M8 ~4 }( _
git clone https://github.com/CityOfZion/neo-python.git& V0 b' z+ j0 ?# O) G# ~
创建并进入虚拟环境
+ o. }+ h( H5 }+ }cd neo-python: J. W0 Q7 X+ h* M8 @, [# K( s
python3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv* A: L3 |1 A; D( V. U
source venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate
; b' N5 x) m* `安装依赖包/ B' |/ h! W1 i3 K& B8 t* N
pip install -r requirements.txt1 h: ~$ {. K$ h" j; S& h6 g
pip install -e .* V7 e: {% t9 }! f- @; P5 i9 F
启动连接到私有链网络,进入NEO cli命令行
$ a% `* u. Q" J( Y) ?' `& s! Vnp-prompt -p # 退出命令行 在命令行输入 quit
0 h0 j# c$ @3 Y  d1 S
- S) _  M  }7 c$ B% `. d出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。* V  }" P" C) F6 _  c
np-prompt -p 可能出现的错误6 r' C4 Y; _* \  E
错误一
+ Z' e6 c7 u$ T3 ?& f$ z4 q% W
4 V: i' L  K+ ?$ R: B5 C
Traceback (most recent call last):# ?7 ]; t# n  y4 c
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in 4 ]# }) k( p0 U( o* g7 a+ y
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
/ U( N! J. n+ {: S' S  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
1 i7 k* ]" x+ H" y& F    return get_distribution(dist).load_entry_point(group, name)* W2 Q2 `  g4 C$ k3 p- n
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
1 s+ l, z0 M* n" y( u0 K# }1 K6 G    return ep.load()$ e6 Y0 q# ?) @  `2 n9 Q) K* l
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load) U2 i2 O# }4 @9 o
    return self.resolve()0 f7 @4 N- V* u" P  _3 U
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve' o8 {9 I* D5 a8 i+ Q
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
2 s; U* v3 O3 l* E. T4 j! U: w  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
1 p5 u+ E3 Z2 ^% K" m8 p: {8 z    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet- h. x9 M) z% l' |/ J
  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in % B( t$ Q% X, G1 m/ X! L
    from neo.Wallets.Wallet import Wallet1 }% u6 H6 A3 S: k
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in 5 d9 @8 s9 X* ]" A8 L9 A
    from Crypto.Cipher import AES/ E2 R, J* n: R
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in 3 D1 U6 ]4 o% e& E
    from Crypto.Cipher._mode_ecb import _create_ecb_cipher' ^1 {, d) b7 P0 j
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in
6 N# r4 g% t$ C2 Y3 d* ^. F    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,( e( n1 B4 U9 J5 ]' D+ v% i
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in
2 L! I7 t: T% r    from Crypto.Util.py3compat import byte_string6 D9 `- ^" r6 b" L+ v
ImportError: cannot import name 'byte_string'/ U5 k. z6 f: L4 M1 v
这是因为依赖包的版本问题,解决方案如下
' ~& m; n. B/ v: ~/ S/ ]( w  m# 卸载依赖包+ w2 b/ q$ J" B# t: J
pip uninstall pycrypto
$ t4 v9 l) `. f- b$ g+ Hpip uninstall pycryptodemo0 y: k9 |& y2 K4 }4 ^/ t) i0 i+ B
# 重新安装依赖包
3 `- C* V9 R; v3 Mpip install pycrypto
4 V+ E' t" \- \) L7 ppip install pycryptodemo$ o+ y7 z: j$ E6 x  Q, \8 c
pip install -e .3 ~- `( n2 T$ k& u' \1 F$ C
错误二3 I# Q0 V7 c/ T! A: v
......
  }* _* [1 X" j( CTraceback (most recent call last):1 ]* g' x; J; L6 U! G- m* v+ `* [. h
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
) Z6 W, @8 N& M& t2 A    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
% q6 y/ C: R$ K' G$ W0 Z  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main
  J1 \9 J* S* o' a  ?4 J$ p6 F    settings.setup_privnet(args.privnet)% ]4 y8 d0 p: o# w
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet" H$ z. K3 y9 {$ K& p) D# _% ~
    self.check_privatenet()
& r  t" `1 w& J( H7 Z  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet
3 e1 Z7 c& B; t2 X5 r    version = client.get_version()4 w: Z# n- L; J% q$ w2 o5 R) ~
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
3 e$ B8 L8 b3 g' p$ [  A    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)) t4 h. R3 C+ z  V2 k0 {
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
" `7 l3 ]1 Q, ^, {/ X% `( C    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))( R: ^: q4 X  D/ [
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',))+ j+ a$ m& q  ^) u4 J% v% j
说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2