Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2381 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。- C, ~, [7 Q/ k

+ R# R6 }+ P, y5 l7 `  Q- a% w* g1 b$ O  B2 _8 Z0 Y4 U+ ]1 P" |1 v
环境搭建! {; }. q7 ~: j( g7 e) }* j% P5 t
基于macOS或Ubuntu,windows用户请自备虚拟机。
" J8 l8 A; X0 U) e# _# J安装Docker及拉取镜像
! z0 ?+ ?6 @% [macOS:" G3 a0 Y9 I4 I( D% |
1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态/ g) T1 \# W# w. O. Q% R

2 n# ~- K0 n  k0 O4 w8 K2.拉取私链镜像,打开终端执行
5 P: Y6 A7 y: V0 M. {- z% i) {docker pull cityofzion/neo-privatenet
8 e9 R2 `% j+ H( K  }9 s
& K/ X% _1 B2 b/ b* wTip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。6 n. M* |8 T7 M: X, x" U
3.运行Docker容器,执行
, ^% p9 N4 T- v, J6 aUbuntu:4 {. N8 @; x: V* H  `; p4 M" m
1.安装Docker,执行
0 }' u& z$ |4 {* }9 h# U" nsudo apt install docker.io
. F/ \. N" o& r  T! K# }2.启动Docker,执行(安装成功后应该会默认已启动)& U) M) {. @) O# t7 j+ \
sudo service docker start0 @8 C( ]/ o- H: X" ^2 ~  C( {" g
3.拉取私有链网络镜像,执行# ~: Z! p  C6 q/ E3 G
sudo docker pull cityofzion/neo-privatenet
2 T% b: U9 w1 }' N( F' M4.运行docker容器,执行5 i6 K9 u* M- x% i. ]& f
sudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet3 v# o7 p  g5 N2 c5 ]( D
安装Python3和levelDB
/ S2 S4 O4 p9 Z2 _+ O% H9 C- `macOS:
; j+ B* q8 B/ g8 A+ Z没有安装过Homebrew的请先执行下面的命令,已安装的忽略。7 X9 W2 o" d0 K1 Y; }3 F& }
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
: F4 P$ A! {; O9 W5 u1.macOS是自带Python2的,我们需要安装Python34 ~4 V- g% `0 j$ ^  K
brew install python3
4 f: _; k. u# Z' r7 J& K. l2.安装levelDB
! Q, `8 F' [* b6 E6 k5 u: cbrew install leveldb2 Q- K7 D: i. R& D
Ubuntu:; h* S  d. t( {5 k5 g
简单粗暴的依次执行下面命令:
1 v$ y* l( e7 b& Nsudo apt install software-properties-common python-software-properties
6 G; M/ M$ J& |/ d# Ssudo add-apt-repository ppa:deadsnakes/ppa
2 s1 m6 d( _2 |sudo apt update
" Q( \! c* k6 b0 d4 ~0 L) ]sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++* |, w; M5 [- j; O
Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。: f9 C" S, M: m" ^% _/ P
neo-python3 ~8 f& A) k( F9 l& @. S6 ^+ P
从GitHub克隆neo-python项目! M8 l2 [% t( b
git clone https://github.com/CityOfZion/neo-python.git+ C" R+ E& w2 _* }8 [' `
创建并进入虚拟环境
9 g. T7 y/ L' F1 gcd neo-python; @) z: B: h2 i: B+ I7 W
python3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv# ?+ ~1 [' O0 b/ f
source venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate
- o% p5 P! l% b2 r' ^1 K安装依赖包
* j% }3 K0 a3 w. u% Y! @pip install -r requirements.txt
$ F' d) W/ G. Q) F, m; jpip install -e .; D5 `' Q- j( |: `/ o# \
启动连接到私有链网络,进入NEO cli命令行
+ s! h( H4 @8 Wnp-prompt -p # 退出命令行 在命令行输入 quit0 w! ]% d, N" p' M; q2 i
( j+ [1 J  F4 K
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。
% r3 f& Z6 K+ N) Y; W6 L1 qnp-prompt -p 可能出现的错误
6 Q" g" |% ]+ c6 ^0 Q错误一; q% |7 X' y. Y& i0 y! O- K0 ~! j

3 F/ g7 o) L9 t6 ^. ^2 |Traceback (most recent call last):! f5 U  B  j1 n* l9 j
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
. X$ \/ \3 r8 C; Z" b8 o    load_entry_point('neo-python', 'console_scripts', 'np-prompt')(); M: g% g' f  a  I$ r8 |
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
0 P. e5 P  F  T( F- G- b    return get_distribution(dist).load_entry_point(group, name)
& l4 _" |1 A0 n* E  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
5 L3 n  }9 A/ P( q2 L    return ep.load()
' ]0 x) ]$ b: t# y+ ?  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
) C& |  S( f" _8 H2 _    return self.resolve(): t$ y9 q" M6 X6 ~) a/ G/ Q. F* X5 b
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve4 j+ L) i6 ]: z" a' ]8 n. c6 H
    module = __import__(self.module_name, fromlist=['__name__'], level=0)0 W6 O2 Y2 E# I8 L) L. I- {4 a
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
% ^% Y0 p: x1 ^- v8 [8 l! Q2 u8 A    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
6 Y5 _3 _0 m- ]% l  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in
, Z, S! W; ]  a3 H    from neo.Wallets.Wallet import Wallet' k$ I! J& M- x5 k4 R: D
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in 0 T6 H& i* _5 P8 d; e
    from Crypto.Cipher import AES* b4 G; o4 r' R
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
& I. e( R; Z  y* I* P5 v3 d( l    from Crypto.Cipher._mode_ecb import _create_ecb_cipher4 A: [) `" L& `% W" f& \
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in
% G8 |, B1 l; }) s! L6 |    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
5 d; v6 A) k6 f- Q% {; `% R  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in , E! a4 [; d. h  \9 e0 q
    from Crypto.Util.py3compat import byte_string8 {8 \; J. W' A& p- A4 I; j
ImportError: cannot import name 'byte_string'
! E6 t, |$ x' y6 G  E1 B这是因为依赖包的版本问题,解决方案如下
, i" h+ [7 W, T" B# 卸载依赖包& N$ z1 w! A: |, ^6 l& x6 O- x
pip uninstall pycrypto9 @' z# r4 a2 [# t/ S9 b. F8 g
pip uninstall pycryptodemo0 n$ M7 q! O3 D3 }) t' d- W& T
# 重新安装依赖包+ ]+ U/ F/ h% H0 O- x5 K
pip install pycrypto) q( k4 @2 H& m7 [
pip install pycryptodemo
' P& F. a+ Q' b5 ^& p. {$ T: ^3 npip install -e .
' N+ C" ]* r, i+ R  r+ y$ I错误二
7 G& w8 r, F9 g  `......
" x7 `" J; R, e+ X- M5 |Traceback (most recent call last):0 D$ ]9 h7 a0 Z8 A' h( I9 A, C7 q8 X
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in ! R: ]# x1 M' N6 ]0 d& P
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()  e/ v+ T" @5 x% }
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main. `1 U, n) ^6 W8 n
    settings.setup_privnet(args.privnet)( h# r" f. H" Y- |
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
6 H( ?) [- T4 q0 \/ m# G    self.check_privatenet()+ |( H( c( v( w
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet7 ^# b- r3 y9 E9 Q" ?5 O
    version = client.get_version()6 ^- j7 F2 }9 z8 }- q
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
7 ?# g+ }$ G1 j# j5 I    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)9 |1 j. p0 F% `2 @5 E1 v
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint( o3 W8 ^4 L: k
    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
# k) z! L# R! K* q9 K7 Jneorpc.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 d; g" v3 l( w
说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2