Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2454 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。% S$ j6 w7 |$ I: s# \4 {

- H# [5 V$ |% Q, O
. ~6 b4 R( |: O& w! s环境搭建# S1 o; b& t) r3 d$ g$ N. s
基于macOS或Ubuntu,windows用户请自备虚拟机。
9 r# J  [: `9 S' w安装Docker及拉取镜像
& N& z, V, {6 D& g/ r9 U( gmacOS:
$ f- k; M/ }; u" H1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态
9 K4 F- |) x/ C) t. V3 e
( N: u7 u- d+ C2.拉取私链镜像,打开终端执行
& p: V+ ~: q3 a. c+ o! d5 cdocker pull cityofzion/neo-privatenet1 `; V2 P0 _! E# A3 g

# h* q2 _4 t/ l1 l) X* H8 ?Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。
4 ]% s6 p& }8 t$ b3.运行Docker容器,执行, B: m2 t# ~% e7 m% n% I8 k
Ubuntu:+ D* ]* Z( k1 U$ P: Z
1.安装Docker,执行
' S4 A/ K; K  ~9 W9 J. }( N4 Osudo apt install docker.io$ z# t% m2 U8 }+ s: v* t" t5 }
2.启动Docker,执行(安装成功后应该会默认已启动)
7 J% H% H" b# p6 Usudo service docker start
% i) v) e7 a  i8 g/ [7 l7 d) w( O1 o3.拉取私有链网络镜像,执行
* L6 ?) k/ |: t6 Jsudo docker pull cityofzion/neo-privatenet
2 {- x0 I0 L+ i! r- v/ P4.运行docker容器,执行
5 j+ o" J) W; A; i2 asudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet
  A3 x/ _0 o5 F7 j" S# P7 [7 b安装Python3和levelDB2 d! A1 d- K+ j3 W1 v
macOS:4 j% N/ F5 ?$ J
没有安装过Homebrew的请先执行下面的命令,已安装的忽略。
) i- r/ k0 Q8 p, `: z1 x/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"2 i/ B# x/ V# S: n+ K- ?
1.macOS是自带Python2的,我们需要安装Python3; S$ \% P  G" D$ W& Y( q" l
brew install python30 o' A1 k  i; B9 S8 I5 i- e; d
2.安装levelDB
5 I' G" I+ {. S. m  \$ s& Vbrew install leveldb8 ]; \2 q: `7 o4 }, i- H5 M% u  Z2 W# o
Ubuntu:; T- S& j2 T# D9 G. ~1 e
简单粗暴的依次执行下面命令:0 f* W* H, }; g
sudo apt install software-properties-common python-software-properties9 R- f( i% j' _/ X4 T- t/ _
sudo add-apt-repository ppa:deadsnakes/ppa! }1 k! f7 x! g( R5 {: P9 Q
sudo apt update
$ M. m. D5 p, W+ b: y3 q4 o6 csudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++, ?: f+ U% P9 D1 Y
Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。
7 _+ b- ~  @  wneo-python
" ^# o1 p" A8 k2 `: \从GitHub克隆neo-python项目7 {% f  {+ a" m( o- G
git clone https://github.com/CityOfZion/neo-python.git
$ v* t9 h6 x; u& |创建并进入虚拟环境
2 g  J/ b; W5 _, n3 ocd neo-python
( O) v/ A2 b# y; e, J4 e: ppython3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv
0 V; s$ a: A/ wsource venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate
* O/ U% j8 O6 @4 W( ~* k2 \安装依赖包
1 T& j( k( [: E  n$ N  m; b: Dpip install -r requirements.txt
+ h% q2 L9 r! M% y( Ppip install -e ." _% I6 d5 u* n  F- T  [% U  Q) Z
启动连接到私有链网络,进入NEO cli命令行
' o5 x5 B& ?" g0 V2 m1 ^9 ]np-prompt -p # 退出命令行 在命令行输入 quit: A$ V4 y2 v3 q; Y* h' X
9 w) I( C9 T' E$ Y" p
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。
, w4 T9 s  [! N( xnp-prompt -p 可能出现的错误
' Y% e2 R. F1 A. m( U! u错误一) [5 B9 [6 J$ ~( x1 @" C

: Q: a' b7 }& Z0 P6 sTraceback (most recent call last):" j8 U' d; W6 u! E
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in 2 A6 A) ?4 W* e5 L
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()# C# I0 `/ \8 z& E5 ^8 X4 n8 c
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
' z6 r3 t2 ]1 U# Y1 d    return get_distribution(dist).load_entry_point(group, name)
0 {/ F8 C7 ]; s6 X1 `4 B4 r  a  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point% L- k0 \; J$ I' Y* ~( P
    return ep.load()0 b9 |. P7 K3 S6 b9 d% m7 W
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load; s2 N' p* K6 c: d/ s2 O
    return self.resolve()
  @* P* d+ g  k/ K, f7 p  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
5 W1 l- O, P5 B/ k+ {0 R    module = __import__(self.module_name, fromlist=['__name__'], level=0)
3 O% x, O* [4 u9 A6 y  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
! P( x4 d+ J6 X/ D; _7 c    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
3 s: X0 N1 A4 l- K5 [  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in
4 y  w2 b/ q& F+ ?# {3 t    from neo.Wallets.Wallet import Wallet; b+ n4 a3 `) Z$ x4 F4 h" x0 @
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in ' n  Z: d4 q% ^
    from Crypto.Cipher import AES
: q( H& L6 S2 o- H) S7 o  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
7 K+ j% B6 N" ]. z    from Crypto.Cipher._mode_ecb import _create_ecb_cipher. @) g- v  j$ `$ }% w/ C
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in ' j2 n- X/ G( u* ~
    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
1 O& f2 Q0 u8 n8 N; S  p' `  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in 0 w# p) p; z9 f& N, d( d
    from Crypto.Util.py3compat import byte_string
) F1 L4 C, `% t; ?5 B: AImportError: cannot import name 'byte_string'
' b- |0 Q& J  A# J' v. N8 D- B& R这是因为依赖包的版本问题,解决方案如下9 f7 L' t& f/ f5 c  F7 c) ?% `  o
# 卸载依赖包
) A" v+ f. z2 O9 x( {pip uninstall pycrypto
$ C- e" Q5 I( U( W9 H) |/ vpip uninstall pycryptodemo7 @. C3 b! {% _. p1 t
# 重新安装依赖包$ b. S! s7 w' d/ E
pip install pycrypto) m" r1 v; q' X& X$ d8 r* H
pip install pycryptodemo
4 O7 e* N1 U% m- U9 O4 c1 Gpip install -e .
: l% S1 y1 s+ U) F3 A错误二( x( R  k6 ?$ y! o: i4 u: m0 K
......
7 K% z# A. F; a* K6 O7 cTraceback (most recent call last):
4 I* U- ?2 Y) g6 t# s  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
& g) h6 Y& x& m6 `    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
3 |/ P5 h8 d2 A# h  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main
0 y* W9 [0 I. z    settings.setup_privnet(args.privnet)
' @" q' X. G. }$ z  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet* S- R7 M7 b- a5 R" \
    self.check_privatenet()3 r0 O- `% L" X: O  I5 i# N
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet
3 r9 L: O6 b/ \    version = client.get_version()
! {$ _0 U) w2 d+ Z; U( h) ]  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version+ s4 f8 K/ c* {- S1 c3 R
    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
: E: h9 w2 H2 o) \4 p  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint7 {: x8 a' h. I' t, O) p
    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))& u) A( Q, m4 B" Y/ T
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',))
, P  c  l5 v8 Q& s" d/ U( r说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2