Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2442 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
9 g# f* G- I$ l9 F7 y% ]! f2 l% q0 o( T" ?& G. f

; M! R2 Y' r/ q) R环境搭建2 D6 F2 o* T/ I% R6 I9 m% q
基于macOS或Ubuntu,windows用户请自备虚拟机。
' Y9 H# Q- Z# z; ?' Y: N. b" B安装Docker及拉取镜像
- t6 W" \3 d! y- F/ F% R9 AmacOS:
4 O4 B" b6 p* d) a+ `; T1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态
8 M( |! O4 ^2 I0 A7 M% H# r6 }& T( G
2.拉取私链镜像,打开终端执行% E; H, V. I- ~+ u
docker pull cityofzion/neo-privatenet
# O+ s1 v8 d8 c8 |  i
8 m+ L" m4 z# w( hTip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。8 y; y/ r/ ]* \( O9 U" o- z* O
3.运行Docker容器,执行5 e9 h) b. x0 {* X& ?1 U
Ubuntu:
) F8 _6 c, H" m* F0 _, I; d9 ]1.安装Docker,执行/ o  n) A/ U7 {0 ~, ^
sudo apt install docker.io% w+ Z7 Q9 ]7 Y3 _: E7 u
2.启动Docker,执行(安装成功后应该会默认已启动); [# ~/ }1 L) G1 r% T
sudo service docker start
* r% `4 e" q8 k# A# y1 y8 U3 N3.拉取私有链网络镜像,执行
6 }  q" e7 R0 T) j$ _" b6 p' R1 ~sudo docker pull cityofzion/neo-privatenet
1 K! r/ _. q/ G2 w8 J* ~0 L; f0 M4.运行docker容器,执行' A0 r$ X$ {' B4 \; ]/ O3 i  m( Z% q  t
sudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet/ D1 }5 t: e7 \3 Z, J3 r
安装Python3和levelDB; O4 e4 r( e% p( t0 W5 `( c# B" O
macOS:
9 u/ A6 T0 }+ x没有安装过Homebrew的请先执行下面的命令,已安装的忽略。1 Y! T) q2 M8 V$ i/ ^9 K
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
; y1 n$ i  S. b8 F4 \1.macOS是自带Python2的,我们需要安装Python3
! R7 D  C$ @- O, a1 p/ Ebrew install python34 f9 q" E% j; {+ v
2.安装levelDB/ ^4 s4 W3 I* K, k: ^$ [
brew install leveldb. B1 D- O" g. o' V5 ~; r
Ubuntu:0 w. a1 w; }% e0 v
简单粗暴的依次执行下面命令:
- M  W7 {9 |  H% p5 {: Nsudo apt install software-properties-common python-software-properties
, s1 c* ^4 H4 [' a) j- c0 Qsudo add-apt-repository ppa:deadsnakes/ppa
8 t1 ~. W5 \9 G) e+ f2 Isudo apt update& ^7 I+ b& I1 c% i# @1 S& M
sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++" t) T/ Z( F1 n! E6 K
Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。
3 ~) d* y' Z  I) j/ R& ]3 sneo-python
# L- D, N' Z0 C) A- v从GitHub克隆neo-python项目" {9 B: m4 \( _; i
git clone https://github.com/CityOfZion/neo-python.git; p/ g1 {1 t- v: |' i  _
创建并进入虚拟环境% Y. o# p6 n( b2 K- d8 L1 C0 W  M- c
cd neo-python+ H: R7 e$ _! E# y7 I& i8 I" O
python3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv
; R, x! F+ d; k. p& @, Xsource venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate, p& z; D0 n& i. E+ Q& A
安装依赖包
6 E# m! o+ G/ spip install -r requirements.txt) G- c' r. a" s3 w' o
pip install -e .
+ r' q, N/ r, T启动连接到私有链网络,进入NEO cli命令行% l  H! z/ ^# u" u5 v5 Z. u' n9 O% c  z
np-prompt -p # 退出命令行 在命令行输入 quit  a7 R! p/ o& Q- \* }1 W2 {- v
* W* F8 q+ Y4 L4 B3 e7 X
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。+ M2 p4 \, c& q+ ?
np-prompt -p 可能出现的错误# H2 e% p7 ~2 Q& D
错误一
$ F% c6 v+ @" }8 [
( I: Y& P8 d1 Y* d
Traceback (most recent call last):
% b5 Q- Z% {/ Y2 V, _! @8 t  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in % g% D5 x, Q4 {7 {7 I; _
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
7 w9 b0 f2 w2 A- j  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point, X5 M# M) N% y4 [
    return get_distribution(dist).load_entry_point(group, name)6 R0 W5 d& l. i* J6 i& K" @
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
; m4 a  R" x: m% r; {    return ep.load(); O0 S2 [( I, ?5 g. v( k  m( Y
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
8 G' S+ M8 K0 h+ ~* Z    return self.resolve()
; `! @7 a+ }6 m  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
9 ~4 |( Q( s/ m' a3 x4 i    module = __import__(self.module_name, fromlist=['__name__'], level=0)6 F: k) G* i  x! }* x" S
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
0 i0 g6 P- Q6 H' Q% ?    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet9 ~( Y  {* o6 u  v3 r
  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in
8 H  B& O' k; a1 h9 y$ U    from neo.Wallets.Wallet import Wallet
8 }( n- u, A+ }* f. J0 y+ ~% Q& P: V  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in
: ~3 [6 U# S7 ?, A/ ~" G3 ^    from Crypto.Cipher import AES
( A: E$ o% ~: K  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
( f$ j; P& q; T' R    from Crypto.Cipher._mode_ecb import _create_ecb_cipher
) p" ?% Y8 c! r2 V  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in
  t" @( \8 ?# q( _8 d    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib," P# J- [& D$ X) X8 j- V
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in / G3 T- B* w; x
    from Crypto.Util.py3compat import byte_string
: F4 z& ~: A* d' r" T( gImportError: cannot import name 'byte_string'$ ?7 g0 S8 C) J; i% g2 F" Y
这是因为依赖包的版本问题,解决方案如下. g* h) b1 l2 m
# 卸载依赖包( l- _# ]% R" _  q
pip uninstall pycrypto
% a% R0 H& `5 B% s$ cpip uninstall pycryptodemo2 A+ I2 K  @4 ~( N9 a
# 重新安装依赖包1 R/ D* F* r- t# {+ p) J6 \% t" r) L; N- Y
pip install pycrypto
& @7 T* k. l% w# S8 [- gpip install pycryptodemo
( J; R/ E7 @" [3 w- Dpip install -e ./ r" `* {+ t$ D9 S
错误二& a! F) l% V* y, \9 ~% j. `6 p- g: ~
......
; h) Q3 _$ p! h/ k9 C9 nTraceback (most recent call last):
. G4 r# F' Q3 t  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in # K' S, [# l3 [' y$ L
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()1 d! h( Z7 e3 u/ ~. ~
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main: Z! J+ H. U, v, J) E9 P2 d& H- F
    settings.setup_privnet(args.privnet)
3 j0 G+ u  R2 D9 b2 L# [  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
. B( }3 I& v  K2 P    self.check_privatenet()
, w+ ~2 }; C; m8 b; |1 d. N; M# g6 w  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet; V2 T& c# t% J7 l! f: p
    version = client.get_version()$ v: l$ p8 @3 A5 q" w7 i3 ^6 H
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
! Z. H0 B9 `, b    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)7 h- O  W$ C( u% U% R
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
- K0 [; z1 M, E+ N, D7 H    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
8 w! g& H4 Z, P# b$ D! aneorpc.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',))$ X: b7 `5 w( |. g% t; n( m; s+ W
说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2