Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2447 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。! X; B6 l, {# D( ^3 W$ X) z" y
- ^3 ^; E# e" O* D5 O
$ D+ R& i% B/ j1 c1 \% Z; c/ k$ m
环境搭建
4 Q5 H! b: _2 |7 j4 p; ]# }9 ~基于macOS或Ubuntu,windows用户请自备虚拟机。
5 {. R  Z" M9 I安装Docker及拉取镜像
( S7 P% g3 s: _macOS:
6 M6 z0 e% J, _4 s9 C8 _1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态- W/ v9 Z0 P* a) g. I: x

/ t8 t" l* C1 j* S- h* V# a5 L  b2.拉取私链镜像,打开终端执行+ W+ t, o  H2 w" Q) |3 _* Z
docker pull cityofzion/neo-privatenet+ r. t4 x: m5 n2 m% T4 ?( V+ f: K
  k3 O( w6 _4 ]" ]: M
Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。& c. @) y, L; z& [/ r
3.运行Docker容器,执行
- p; d5 m8 o  aUbuntu:7 R9 j0 B7 x: n3 c
1.安装Docker,执行% |. ~- ]5 C! ^6 g! E7 s/ c
sudo apt install docker.io: [+ Z; n0 L9 [! P
2.启动Docker,执行(安装成功后应该会默认已启动)/ ?% u8 Y0 \( ]
sudo service docker start
, ]+ m% Q- e% ~6 {3.拉取私有链网络镜像,执行3 |  Y. U5 o/ l
sudo docker pull cityofzion/neo-privatenet
4 t0 q* N1 D' U, b) o4.运行docker容器,执行
" w; d, s$ [. b. K9 k2 E( ?sudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet. O$ ~, ^2 E9 x
安装Python3和levelDB( ]! e4 w5 u# ~+ ?0 f8 n7 v
macOS:
! E7 l. g. B" k9 K2 d- i没有安装过Homebrew的请先执行下面的命令,已安装的忽略。3 U4 V+ `% D* H9 [
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"$ O/ I0 j" o4 w0 T
1.macOS是自带Python2的,我们需要安装Python3
5 y% j! [* z& w2 u* _& @. Z3 ^, Z' l5 jbrew install python3% a6 u0 I* ?* H$ L( H' D% E) J
2.安装levelDB
/ H6 C+ C8 Q% mbrew install leveldb3 C4 p$ v# W; R) R7 n6 \; z+ q: s
Ubuntu:
. W# J7 N* _: {- x简单粗暴的依次执行下面命令:
3 Y6 o7 U8 n& G; V* q5 A- B( msudo apt install software-properties-common python-software-properties
8 Q) B: f# y  }0 L0 |sudo add-apt-repository ppa:deadsnakes/ppa  h( H$ r) A6 H: ]( e. o
sudo apt update. t- ?" s/ E' G: u5 Q% Z- R
sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++& q2 x* }( H/ Y4 m" ]: Y$ |
Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。7 M8 {4 g; R! U9 n# O5 y
neo-python+ D4 t3 p) i0 I! {+ k) B
从GitHub克隆neo-python项目
9 I1 H% L. N4 ]git clone https://github.com/CityOfZion/neo-python.git
* x. b- |9 b# C- |& Z创建并进入虚拟环境' G' _; }  \2 U7 n
cd neo-python
. i* U! ^, C0 r. p8 Hpython3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv
# M. k: y4 f. Bsource venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate
: \) m# D7 \1 n/ \% d# c安装依赖包9 U- `. E; p+ X
pip install -r requirements.txt8 t6 x! T, I' \) X3 F5 W
pip install -e .& r& ]/ t) b8 F
启动连接到私有链网络,进入NEO cli命令行
% L3 i6 {# Q, Z9 p; pnp-prompt -p # 退出命令行 在命令行输入 quit
4 }& c: A4 B8 L8 a+ B' a2 D% P2 e. M, D' W6 C. u" M
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。
9 ?2 I2 _+ ]. |" v" g8 w3 Gnp-prompt -p 可能出现的错误- t8 B) f6 J# T- [6 u9 M& ^
错误一: }  T9 t4 \5 Q) l5 e* c) U
7 z# {7 B* @2 ~, ?/ D/ I) Q
Traceback (most recent call last):
: `2 @/ B5 J4 {  R9 i  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in 3 a2 d. H( v" }
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
& c$ t4 f( w# ?: u  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point8 U: f" J4 L) Z+ Z9 \
    return get_distribution(dist).load_entry_point(group, name)
' e+ ^$ Y0 n7 g* s, l, P$ }- Q/ D  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
7 k  G$ ]' r8 V( l7 x6 A2 T. z    return ep.load()! X- T- C8 c4 v- p# ], C
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
. w0 a, ]% L; V) K    return self.resolve()0 @4 O7 l$ ]  b0 R4 x7 @, w% e
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve& `0 K1 v( \- Z$ n( {  y: ]
    module = __import__(self.module_name, fromlist=['__name__'], level=0)$ d  [# Z5 j3 S" k; W; W
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
) Z# h; r3 t: E) l/ R$ c/ v    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet( v, E# s% p' h( m
  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in
& k% @: W# x6 K+ V    from neo.Wallets.Wallet import Wallet
3 u; J; C. _( e+ r1 z3 h  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in
& F& e8 U( _2 Q! v& n3 R! \, @" p, L    from Crypto.Cipher import AES; @, s: E' @3 \. A) x
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
0 ]6 _& A3 R0 f1 o0 y" u2 l    from Crypto.Cipher._mode_ecb import _create_ecb_cipher
* [+ d8 A8 D0 s) }" _9 {& {0 ~$ H  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in
$ i: M9 l( T+ H7 }7 M    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
" e' w: G3 ^) D8 Z0 o2 W  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in : Q, T7 z4 e! Z! ~+ c/ N
    from Crypto.Util.py3compat import byte_string
: y4 {0 c. U6 p* B" C3 @- c& l. M9 TImportError: cannot import name 'byte_string'
4 o8 N7 x; X5 F  V' u/ X这是因为依赖包的版本问题,解决方案如下
9 w9 ?! j6 r9 r' d# i# 卸载依赖包0 p5 h8 a. {1 {* J) D
pip uninstall pycrypto
3 k. P! A% o/ p. f! j5 q" X# npip uninstall pycryptodemo+ Z- [  f' C6 Y& v$ Q
# 重新安装依赖包- @8 P! Z- n4 L( v: V
pip install pycrypto
) E9 b0 k+ O* ?% R( Jpip install pycryptodemo
! n0 Z" o% [3 K+ W) T) V$ Ypip install -e .( T# ~! G4 E; N& z: Y1 Y
错误二8 [. ?7 M! U/ k* e7 u. G. K
......
' N) E+ {4 @" l4 ~# mTraceback (most recent call last):% X9 }: `  q. T' ^
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
' L9 p. `( m& [9 ]+ S    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()' C! f' k$ S- U& [) X
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main
6 Y9 Q) @3 Y9 d" N- q    settings.setup_privnet(args.privnet)/ r& W9 m0 T' R$ P
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
& ?* w, l- L" l4 b8 ?/ B* O    self.check_privatenet()* ~" b4 |* d) K3 Z+ ~) r" C8 z7 Y2 r
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet
! R7 ?6 i: Z- W3 U) q    version = client.get_version()+ X: }1 }/ F5 [
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
- w- I# w% c, a4 H$ z0 ~    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
7 K& D  W# E; u# ]( T! W/ _& J  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
7 ~7 [; @$ i9 D    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
+ w: u- @1 R8 y+ t% a; oneorpc.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',))
0 I% f/ H9 C% g+ u说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2