Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2380 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
0 I* t# A+ C7 h4 l$ S1 ^" E  D' j5 I: K
; `; w, C1 S4 o3 w0 u6 H) C. b
环境搭建
! P8 K! Z0 K/ w基于macOS或Ubuntu,windows用户请自备虚拟机。
3 p& T8 F6 w1 |/ N5 y" r) `* Y安装Docker及拉取镜像
( D2 v5 Y+ A1 DmacOS:4 J: z5 f: I9 b7 ~6 p
1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态( C* P2 @- w" Q6 {" c5 b  h( t' I- ~

# v  C- d) r0 Z2.拉取私链镜像,打开终端执行( @4 _& o1 f$ K1 V
docker pull cityofzion/neo-privatenet) ^4 k. ^- {, S/ z1 m

4 V0 G" i+ X. \" d- O4 DTip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。% O( E' s/ ]$ D
3.运行Docker容器,执行3 ^0 ^$ V/ S7 a- A# R8 t( P' k
Ubuntu:. z: S+ y  w, }5 y2 w& |$ Q/ H
1.安装Docker,执行
6 `6 i# Q" X6 R" b( r, Hsudo apt install docker.io
( @$ _8 @3 H4 y. t! c$ c2.启动Docker,执行(安装成功后应该会默认已启动)
1 k* L) {( [. K: zsudo service docker start
0 b$ ]4 u& i8 l3.拉取私有链网络镜像,执行
8 e6 T) A8 B5 a5 y7 B* j7 }. nsudo docker pull cityofzion/neo-privatenet
" s+ J2 K) _/ h! X3 V( {4.运行docker容器,执行! A1 X# Y" z0 n
sudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet
  O% B6 p1 N# q, Z: R$ w% e安装Python3和levelDB
2 b8 l1 m- c8 _8 N+ c. cmacOS:
6 o& x: {  j8 G% W没有安装过Homebrew的请先执行下面的命令,已安装的忽略。: m2 c5 }* m7 ^# M+ _2 Q3 W
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"& H( v! [* N5 H7 K
1.macOS是自带Python2的,我们需要安装Python3
7 v! z0 l; y. [! |+ U% Wbrew install python3
9 ]# c& S! k- F; o2.安装levelDB
# b: v4 q1 U; obrew install leveldb
* R5 a. n4 Q" q0 E8 j& R" g6 MUbuntu:% c/ u4 l% z8 p- I0 O4 Q
简单粗暴的依次执行下面命令:$ f! n+ Y% I. |' e' {
sudo apt install software-properties-common python-software-properties$ C/ ~8 ?5 I: w4 T
sudo add-apt-repository ppa:deadsnakes/ppa
+ I: ]  r- R; d1 ^8 J. J( hsudo apt update
$ I+ ?: y& f+ j* Z% x% ?9 X* _; @sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++: ?8 {( A1 s# j8 X
Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。: F4 F3 |" S% X1 W! C% C9 E
neo-python1 W2 ~( l7 ~/ w. F# J
从GitHub克隆neo-python项目
' j2 f2 n5 |: r, Qgit clone https://github.com/CityOfZion/neo-python.git: B  r; T, w. g( f
创建并进入虚拟环境
2 x1 H7 E) ~* J: |cd neo-python
/ ?3 V* N  d1 _6 A+ T; _5 I% H1 fpython3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv, y; J+ b; _1 l9 S( [$ q; c
source venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate" H  x0 ]8 B. c0 ]; t! B; w
安装依赖包: O) R) p) }4 k5 b- e
pip install -r requirements.txt8 T6 C! E/ Q$ }
pip install -e .
) c" k9 r: e% \启动连接到私有链网络,进入NEO cli命令行
1 `8 `/ A) ^2 z6 `7 w* W( V% g; jnp-prompt -p # 退出命令行 在命令行输入 quit
7 J* w+ @9 z" ]) ?" h9 q9 W) E3 m5 v
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。* [4 m2 u) ~5 t: q
np-prompt -p 可能出现的错误" B# O0 d+ i" I& c
错误一6 x( y7 @  G! [' ~

8 |- M" W5 [* y5 e% i/ LTraceback (most recent call last):
& C4 R! t$ j9 E  j  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in " o; W# U: E0 {* \, c, Y& d& a
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()  P' Q; q2 ~8 z6 Z& O5 }
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
% F/ x, ?: I4 j1 n& i% G' F& t( R    return get_distribution(dist).load_entry_point(group, name)- f: D+ Z$ K3 M* p, }
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
1 E% R% E1 f) H    return ep.load()
& h, U. M# Q; a0 P: o# s8 ^  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load( P2 G5 S$ K* T" I7 [# ]+ v
    return self.resolve()
1 @  J. ^9 H2 Q5 V) u8 J  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve3 s% ^8 a5 c8 C& u
    module = __import__(self.module_name, fromlist=['__name__'], level=0). c: \1 I7 a0 M( k9 E0 R
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in 2 a" r6 W+ b) b9 w, D
    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
$ n0 Q) x% K1 r' B/ i: b. ~( b# A  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in
$ W$ ]# K9 a4 I" b2 U1 O4 {+ S    from neo.Wallets.Wallet import Wallet" r# k+ O$ Z) ^0 K# [
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in ) X; h2 M' A; I9 s
    from Crypto.Cipher import AES
8 A1 b- V/ o, p+ `# Y  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
; z; t3 e' k# v/ d# b    from Crypto.Cipher._mode_ecb import _create_ecb_cipher! A4 I0 F7 }# F9 ~* P* A
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in 6 z3 h. t* s0 w) T
    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
9 B4 Y$ ?( l. U/ x! c  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in ' G- ?2 m" K! R; L
    from Crypto.Util.py3compat import byte_string
+ o. u2 S" [  K4 h2 b: p- rImportError: cannot import name 'byte_string'$ F$ ?& V4 G, \. b* J
这是因为依赖包的版本问题,解决方案如下
# m( H! D: a* [3 s2 T- C+ C- w# 卸载依赖包; ^# X* \8 }2 p1 Q# W
pip uninstall pycrypto; V3 u( V7 ?8 q* E" B4 ?! J- P# z! X
pip uninstall pycryptodemo
" L+ `; z" b. G7 T: s( E  M6 y# 重新安装依赖包
: ?- ]. g, T( n: Q8 vpip install pycrypto- ?0 e4 }% Q8 ?
pip install pycryptodemo3 L# b9 B3 a; j0 g$ A5 i) O* J8 r( j
pip install -e ." t8 M6 L  @0 W8 _$ q/ `" ^; B
错误二
' b( ^" }  j$ x. o! Y  K! X( I......, ]; D, F7 R* ^, {$ @
Traceback (most recent call last):
/ F/ c' S3 H2 e1 u  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in 0 @& N  Z+ T( c
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')(). `6 L- J2 q4 I- t
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main$ x7 T1 a' b$ c
    settings.setup_privnet(args.privnet)% s7 T( [" x* c  e) A: ^: d" b
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
, m* j" W1 |) j) g" D* J/ B0 I    self.check_privatenet()8 a+ w  T: o, o- q; w9 i$ O% R3 }
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet. S2 O! ?7 b3 [6 D
    version = client.get_version()
% h  j3 Q: J5 T' \  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
+ ^% ?7 M, W- q) Y) H$ n- l$ l, M    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
7 L. F% D4 r0 [% V' E9 d  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
* [8 j  b9 k) L    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
/ ^5 ]5 H3 u9 V$ ~/ Y' R  J6 lneorpc.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',))6 o8 ?0 J" d% j6 T% ^1 l
说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2