Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2449 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
; F1 z8 g; d, G4 ?; o8 l& e2 P' P0 n8 A

* p- L9 v2 R2 o9 D. n环境搭建
) H& w5 a0 J. x3 O7 k基于macOS或Ubuntu,windows用户请自备虚拟机。4 {3 g( ?+ i0 s# @6 Q
安装Docker及拉取镜像- @% L9 S- A- z
macOS:
- y6 g. Y% f: k1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态
8 ?8 e+ O& F! u5 T# b
7 z4 H& ~7 V5 A/ A: M/ x2.拉取私链镜像,打开终端执行
% ~* |  i# `/ @+ o% ~2 Q' bdocker pull cityofzion/neo-privatenet2 J) Y8 u6 G, R- q  t1 M
1 c3 c# n  ]/ a) `' W
Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。, y7 d! m! Z/ ]( G3 o) L
3.运行Docker容器,执行
8 R0 b( x+ d# \  j4 |! L8 r8 kUbuntu:
7 I' G7 @1 v! Z% H  Y$ [6 C' J# l1.安装Docker,执行- X5 x& E2 ]( m7 T* N( e5 P  F4 Z
sudo apt install docker.io
- R8 l1 y9 \, L- \: X; X2.启动Docker,执行(安装成功后应该会默认已启动)
5 X/ F9 \  E2 e" esudo service docker start
9 U6 R8 o+ X) i' F+ x3 ~8 G3.拉取私有链网络镜像,执行
; P" a2 L: y8 Z: G# m) o' G& y/ U) isudo docker pull cityofzion/neo-privatenet: g- T7 I$ I$ I3 S' S3 N& ?$ ]
4.运行docker容器,执行
2 @; I9 n9 {7 P' H5 _5 usudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet# O/ k' b  {* R8 C$ q. A  y
安装Python3和levelDB- Q/ S, y- \* @) o$ a  a8 O' s
macOS:
# B( ~0 b" r/ n2 Z/ K: z% D没有安装过Homebrew的请先执行下面的命令,已安装的忽略。
  d. f9 p8 K# ]& U. a: J/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"6 ]% u. V* ^" t6 B
1.macOS是自带Python2的,我们需要安装Python3! s2 t/ F7 ^" t8 Y6 Z" G- a; d
brew install python3% d5 i/ \$ s. v" G/ ]
2.安装levelDB% s2 S$ C8 K7 v( l* W1 ^: J
brew install leveldb0 o! _+ l+ ]: d( r
Ubuntu:
6 o7 V8 ?3 s3 R! \" z简单粗暴的依次执行下面命令:
3 c( F( v+ B: u9 n7 t. jsudo apt install software-properties-common python-software-properties
6 L/ H) B8 r) L. c! O' }, O; p, ksudo add-apt-repository ppa:deadsnakes/ppa
* l6 I1 m+ f& O: ksudo apt update
( _( B2 x/ |5 z9 _sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++
# v- X; V7 G/ S: H. }5 STip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。
5 T. ?0 \& n  r! x3 j. _  l& L5 ^neo-python$ a9 q% `9 [/ V& {) @! u6 `
从GitHub克隆neo-python项目# j; }8 i1 d/ L2 C2 n
git clone https://github.com/CityOfZion/neo-python.git" Y3 \, j" `' K3 @
创建并进入虚拟环境! M/ b8 A/ _; O3 D1 U
cd neo-python
8 N5 T; B& s( ~1 W. F  e8 Q, Spython3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv! m5 B! \: _4 @4 T% o
source venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate6 \" N: z3 i9 {+ ^
安装依赖包3 [6 T6 ~9 y- k0 y' h9 @
pip install -r requirements.txt1 s3 n5 T8 h6 l4 q- V
pip install -e .
4 Y' H! I7 g( h! i" a0 R启动连接到私有链网络,进入NEO cli命令行% @% V/ ~0 y: g0 p* ~4 F4 d
np-prompt -p # 退出命令行 在命令行输入 quit
8 W! X/ t$ q- ~
! m5 ?$ ~0 n' H. v% L1 A出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。1 V- v& e! B4 K! @$ _
np-prompt -p 可能出现的错误
2 t3 O7 D& Y  Q1 p错误一
. h, o& w3 {- y7 c
' A6 _, B0 m; a6 z
Traceback (most recent call last):
: {% d% b9 D+ |. b% H% P  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
  W! l0 z' B4 M1 w) k8 ~% K5 d. k    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
# m$ \' E1 D! Q7 H0 ~  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
; W3 P+ e1 ]' O7 m7 @    return get_distribution(dist).load_entry_point(group, name)
+ w3 x; `, a6 x' ]: \/ Q" B% y$ t  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point9 f* s4 a1 O+ u9 [5 C' e& R0 ]$ `
    return ep.load()7 _, d: g, S$ f4 T7 Z) {) x: [
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
9 m  P: V/ M9 X8 g7 G, `    return self.resolve()  w: R$ u, h: p! l/ E. r
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve- t( o8 C: E8 G0 H9 z
    module = __import__(self.module_name, fromlist=['__name__'], level=0)% B+ `, J% F9 e) K0 S
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in # u9 z' V# c+ A9 i" m
    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
) q3 v8 N9 ]+ x! ^0 s" P/ B. f& e  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in
0 Z6 u% Q& O. g& c    from neo.Wallets.Wallet import Wallet( B. F: h& l6 [7 D' p
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in 7 |  h. [0 v- n0 V- ^
    from Crypto.Cipher import AES
1 E! N0 s2 J' s  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in & P: I0 E! w9 M- f6 ~- x$ r5 c, |
    from Crypto.Cipher._mode_ecb import _create_ecb_cipher
  Y$ Y4 x- e% S: |. G4 d0 f% ?  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in
/ m  k5 R4 Y* x/ V7 M/ D$ ?    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
1 A7 I  l4 `# L8 H4 m% k  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in . u. T2 _7 @# w) Q. V7 q; i
    from Crypto.Util.py3compat import byte_string+ h4 F: y# ]9 A8 z
ImportError: cannot import name 'byte_string'
/ j6 l/ L( J" f* R- A) C' Q6 U这是因为依赖包的版本问题,解决方案如下# \, s* O0 ?$ a
# 卸载依赖包
$ j/ v+ H0 U% c  d5 \pip uninstall pycrypto9 [- q" p' q1 d
pip uninstall pycryptodemo
5 M/ h4 }4 E/ m/ B6 O# 重新安装依赖包
0 s7 K! t1 [# o% w& }1 r0 x8 `6 npip install pycrypto
$ O. z7 J2 M7 f( F- J* q8 }pip install pycryptodemo' I/ e) o  O& l9 t
pip install -e .1 k* \" a; n- F5 I" Q! ^) b
错误二' y9 _% e  H' j5 P
......$ ]1 U( x0 @. H$ t. H  o+ Z  s7 ]2 p
Traceback (most recent call last):
. x% B: Q* r1 k  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in % j3 v, h5 A3 H
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
3 j  G' u8 @; _. P  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main5 `& M. ^9 c2 W( V* v$ s
    settings.setup_privnet(args.privnet)
5 q* l% Z0 H! a' q2 E; e* X  `+ Z" ?  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
0 i5 a2 _; C+ }4 `    self.check_privatenet()
4 W# S8 O3 F6 G: ?9 q' I: q  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet) S2 M; {( W) q# L
    version = client.get_version()8 M/ T! \( u* \
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version' L; S6 i: B( O$ m- d5 S
    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)2 [# d/ |5 q6 D/ V$ h5 \. o) o
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
$ A- D' C) ?3 v; C    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))! x; P7 h- H) `+ s* S) A6 v
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',))
5 x' l5 m" [2 {: K说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2