Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2378 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
# T5 E) h5 `, }( r$ g" G( j* p1 \) F
) s3 ~! t. t7 t5 a5 j: p; _  I9 c; j
环境搭建1 r( E+ H% f7 ], j  o; j! S
基于macOS或Ubuntu,windows用户请自备虚拟机。9 n1 z* J! a: [: o7 K" l
安装Docker及拉取镜像& P; U! S- N4 m7 x3 D' O
macOS:+ Y& I& |2 b0 W: W, o
1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态
% C2 [7 d0 T& l! L
6 C( ?& r* Z2 ?: I' }* \2.拉取私链镜像,打开终端执行
7 [( Q* N5 h- O! k7 f5 Kdocker pull cityofzion/neo-privatenet, C+ y7 E5 P/ U- }
, j/ E' {% O& i0 H4 a7 x  @# s
Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。  U- }/ z9 X; _9 m! G
3.运行Docker容器,执行
: i" r/ F- f; z, B, K' PUbuntu:
% k$ \& [! F' {5 a- n1.安装Docker,执行
$ ?( E8 s9 e9 Q: I: E- a, `sudo apt install docker.io
* J/ f# v1 W* C( d# E$ z8 ^0 a* q9 G2.启动Docker,执行(安装成功后应该会默认已启动)
, Q  u0 Z# j5 D1 I8 m/ V4 o: G" O# ~+ Lsudo service docker start6 h! L" \; @, v( _
3.拉取私有链网络镜像,执行" d+ ]! S# z1 y# l+ I
sudo docker pull cityofzion/neo-privatenet
" H; a) Z* J- x7 C4.运行docker容器,执行
4 O- Y; N; {4 W! a1 m1 ^3 A0 fsudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet
8 e/ u& F  i$ E# u安装Python3和levelDB% N" ]7 Z2 B- `( Y/ u  u, \
macOS:; f/ _8 M9 K, [  }
没有安装过Homebrew的请先执行下面的命令,已安装的忽略。
1 r2 f0 K$ ^: R/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
; I" f( |$ `9 Z. z! L! }1.macOS是自带Python2的,我们需要安装Python3- r6 b' `4 A# ?6 r- N& a" ^3 D! ?
brew install python3
( L9 l$ v  m4 q! B, P& |1 ~4 W2.安装levelDB1 x  P0 p) Z( \3 O  \! f
brew install leveldb5 f( E- `: P* T2 l
Ubuntu:
2 O4 h9 r, p+ K+ a) \$ l7 F: I  Z简单粗暴的依次执行下面命令:+ K, y' w6 c6 D5 m2 A0 s. ?
sudo apt install software-properties-common python-software-properties
0 ~8 x( W8 p6 j) x( Hsudo add-apt-repository ppa:deadsnakes/ppa9 N0 g4 v9 r% H
sudo apt update
) K8 y" T+ I7 V; z+ ~7 usudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++8 ~) z. m4 D* \, y- F& V, C2 m
Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。) t( b) O6 j* H9 q# ?) O. T: L
neo-python( {2 x& Z% r- J1 X8 d8 _
从GitHub克隆neo-python项目7 s' j4 k; }- a* L) V5 N0 k; s' G
git clone https://github.com/CityOfZion/neo-python.git
/ M0 N8 `  w( H* z) A创建并进入虚拟环境
" r. h1 a3 G/ Scd neo-python7 ]$ C6 B1 v3 b8 w" H
python3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv
* j0 S) i& l8 M2 k4 m/ ysource venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate% g; w  @) B& S# \- Q( O2 O0 `
安装依赖包. }3 G7 c4 L% q# H9 ]0 u
pip install -r requirements.txt6 ^) S9 A: b- \4 [$ R+ H0 _/ \
pip install -e .6 D/ D" i# s) Y' c; Q. u6 C) V' ]
启动连接到私有链网络,进入NEO cli命令行8 {3 h7 M; l( }* c/ u
np-prompt -p # 退出命令行 在命令行输入 quit; ?; M$ N; U  O( @( l

! I0 Q; W* y% ]1 n出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。/ K5 R2 @) L' P4 n
np-prompt -p 可能出现的错误, d0 D+ H* j6 s& n! x
错误一
5 i9 T& ^( p, g" N0 P' b0 ]
! h- \* W! B- J& ?& r3 \) Y% I% F
Traceback (most recent call last):$ L8 R# `- J- D; G2 d# B- B
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
0 k/ q1 p/ r( p. w3 C6 I' h    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()* p) e& a; o9 S
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point* \; G% D# c" j0 a- f7 c
    return get_distribution(dist).load_entry_point(group, name)
% i: \" \6 h& K8 Q& s4 m  B- F  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
1 X4 o; o" v6 r& j. p: S& p    return ep.load()2 ~& F' M8 a% ]
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load( Z" q: V$ Z/ a2 [2 F3 T' `- u+ M
    return self.resolve()
( J; [% M; ^2 |2 b' u* ^1 R  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
4 P1 h4 r- P. P0 m+ [  ~% P    module = __import__(self.module_name, fromlist=['__name__'], level=0)4 y1 e8 D8 H8 }. P: _1 ?- t7 g
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in # p& S5 P! G8 ~0 v
    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet( w! I* b) C; o$ i4 T& Q& x  N, w
  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in / z' f) g* s6 {/ Y  o
    from neo.Wallets.Wallet import Wallet
6 Z3 g. b4 }# T1 F  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in 9 Z) [+ j: h- x# ~0 u
    from Crypto.Cipher import AES7 K* v9 Q5 U( x: U/ m# Y6 N
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
5 X9 Z3 l6 A/ E" d    from Crypto.Cipher._mode_ecb import _create_ecb_cipher1 P* E3 v# v: I& `# r6 k6 z: w: z, J9 Q9 N
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in 6 v/ k& L0 L. K5 d' r# @& ~, g
    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,5 X5 e- _5 s, e4 ~3 t: ^3 |
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in 8 @4 n2 I7 k- P2 @* q
    from Crypto.Util.py3compat import byte_string( G( E3 G) x4 E2 u& ^! ]
ImportError: cannot import name 'byte_string'8 z0 Z9 Z6 {" @1 a* g3 k
这是因为依赖包的版本问题,解决方案如下
2 H9 G- o" k/ f* H; ]# 卸载依赖包
  o: q, W& _5 Zpip uninstall pycrypto
" ^/ j+ r; l) Jpip uninstall pycryptodemo
( ~3 i9 `2 J& ~8 J" s. t; [, ]# `' b6 Q# 重新安装依赖包4 D- z, v  [8 L3 _7 k
pip install pycrypto$ O# ~' @0 K( o2 X" p3 m% A
pip install pycryptodemo6 {" k; [7 \0 v
pip install -e .
4 I- `, [( ^" \( w, z错误二
) z( J+ c4 _6 }' P9 b7 l......
* b9 k3 }; B" Q) f0 d/ Q: L9 [4 QTraceback (most recent call last):* q* i, V' c9 l5 q* Q1 ]
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
! P6 r( ]9 E& q) Q1 ]7 p) \    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()& O5 n, M0 x  j) r5 A! [5 V
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main
+ @7 ?; s0 G: k# f% a, j  m    settings.setup_privnet(args.privnet)
! b6 c4 u0 @% {4 {3 o: \  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet9 j( }7 j8 a) `0 G
    self.check_privatenet()
% L7 c7 Q) I' D# l* m1 I  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet; S4 D3 C3 J. `3 A' s8 b& L; _
    version = client.get_version()
; q  U+ Z3 l5 h  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version% A* C; ~+ d* A" x
    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
0 H  P1 j8 n$ }4 B) u8 [  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint* P$ r9 U* L" n6 P5 a* P
    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
6 L' V+ o& {( R; S9 f, nneorpc.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',)); a0 A0 z; A6 I, O' N' W
说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2