Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2354 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
/ O' e+ M4 T6 @( V( {
8 U+ a' c0 ~) b( M( i- |0 G% C9 C, _1 r5 X; ~0 i
环境搭建" H$ T8 t/ A: i4 O6 F0 r. \" e" C
基于macOS或Ubuntu,windows用户请自备虚拟机。" B, d& x* h4 n' o0 \+ \& W7 o
安装Docker及拉取镜像9 L0 v1 j  M, _* }: q! Q
macOS:
9 C! |- [  E: I! n/ \1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态
0 h( J6 b9 V6 K& Z* s6 k
8 n0 U+ j2 z3 F2 {4 H0 z% z* Y2.拉取私链镜像,打开终端执行
5 X2 i# D, l. Y3 k/ }+ V. I& P: Xdocker pull cityofzion/neo-privatenet  m8 D( F$ O( c

8 r' W' T" @) L% @( X4 KTip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。- C4 f" M. n  ]# e% S' P$ b
3.运行Docker容器,执行
1 ^7 K/ \( b% q9 I9 X0 r9 h* ~, D1 SUbuntu:9 |) d% Q1 |  p# ?! c2 B. P* |
1.安装Docker,执行: k- P$ u9 t0 K( d
sudo apt install docker.io' U; c7 h5 U1 R9 ?
2.启动Docker,执行(安装成功后应该会默认已启动)
  \2 e. g* R& o3 [4 L* K3 Tsudo service docker start
! ]# L5 g3 s0 t/ o3 b2 O( z3 o3.拉取私有链网络镜像,执行# a9 @+ a5 U4 s
sudo docker pull cityofzion/neo-privatenet( c5 o8 _2 B) d3 V, g
4.运行docker容器,执行
/ R0 V/ v( I( J2 p5 l; D/ Fsudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet
6 C0 ?( l; E$ X, r6 |0 c# M安装Python3和levelDB
8 E. z9 Y  k) |8 J- ?macOS:
$ H- X/ x2 \7 `, O  K& L没有安装过Homebrew的请先执行下面的命令,已安装的忽略。6 O3 E) e. ~. z3 V- G# u1 D
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"4 I. A" G; K4 g
1.macOS是自带Python2的,我们需要安装Python3- q3 I. X& q2 `) |9 _
brew install python3$ s! Y& K* J' Y; y* d9 P
2.安装levelDB3 Z9 K( {  f4 M- V1 ]; l' O: D
brew install leveldb! ]: ^# h' k8 y+ V7 Y8 {
Ubuntu:
" }) _' p$ d" s' B+ ^简单粗暴的依次执行下面命令:  f! F1 Z: s9 }0 M
sudo apt install software-properties-common python-software-properties: f; x4 N8 U* E
sudo add-apt-repository ppa:deadsnakes/ppa
- V/ }" c0 e4 h- E# Asudo apt update( p. c  G1 f/ i& q) G
sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++
3 `, s$ E" _) I' gTip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。
) L! e7 j+ }8 P0 \neo-python
: Z; U/ q7 U& W: H: p从GitHub克隆neo-python项目5 J. m1 {3 s: y4 i- K7 @5 n1 l
git clone https://github.com/CityOfZion/neo-python.git, k& N0 S% @1 O: n
创建并进入虚拟环境4 m% j+ [- n. Y. z7 p4 a) V( r
cd neo-python
0 T  a0 x) H; a) N4 z( a! Lpython3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv
" V% n: ]: c9 \3 w0 csource venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate
& z0 B" _* h0 ]# y安装依赖包
' g, E; P& \5 H; |pip install -r requirements.txt
/ B* O, o9 y) m8 \pip install -e .
4 N$ R  V2 U! h启动连接到私有链网络,进入NEO cli命令行
  j* D  N# `3 c( I! `8 L0 G0 q. knp-prompt -p # 退出命令行 在命令行输入 quit
; k1 a; x9 v$ s' q0 @7 N- @. y" I% i) q" o6 J1 N3 E6 N! E7 }
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。/ t" a/ r; n. r* Q7 z
np-prompt -p 可能出现的错误
/ Y: J, p+ `- H# Q- z0 L错误一+ D! m' ?3 {2 w) a5 `- {, B
: i2 e$ E  z& ~) P8 T5 \  t8 u3 }+ }
Traceback (most recent call last):
3 f5 m4 z% z& K$ U  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in " @  [+ k8 e+ g% k  o8 U
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()$ h/ M% j$ V. N  W2 b7 ~
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
& h0 I: I) d# U) s    return get_distribution(dist).load_entry_point(group, name)* _9 C* _$ \' E. f1 ^5 w# u' S! g
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
8 c: t3 Q( j% C: b9 W* `    return ep.load()
! D( b5 x- G; y2 j  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
: [4 m$ q' \( n8 x* S* g5 n4 n    return self.resolve()  R2 o; |9 s6 k
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
5 L# H& D. b) s  g' [) W    module = __import__(self.module_name, fromlist=['__name__'], level=0)$ B; P. |! _9 l
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in ( ^4 V6 i  \8 H$ `3 g9 v
    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet) \, A' O8 ?8 z  u
  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in - {  y' f1 H+ Y& Q& Q# O" E
    from neo.Wallets.Wallet import Wallet/ K2 a3 y% r" h, x$ N3 i
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in 9 c; c( F7 M0 L4 x% }9 }. H# J
    from Crypto.Cipher import AES  J, _- Y% a9 e+ J
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
" S3 U+ f# \9 }0 q. E    from Crypto.Cipher._mode_ecb import _create_ecb_cipher  K+ R- f9 X6 S: A* k3 J
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in " m/ C) v2 d. E3 t
    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,; i( D( M& g# C5 b
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in
/ j+ ^+ H1 ~" T5 e/ m    from Crypto.Util.py3compat import byte_string9 s5 y& \% p9 L" h
ImportError: cannot import name 'byte_string'
* h' u: Q+ }% d+ `% ?+ f7 K这是因为依赖包的版本问题,解决方案如下1 E/ _# E+ u: }) h& b$ J
# 卸载依赖包
9 I' H$ j2 }: jpip uninstall pycrypto
8 T$ \* f: }: w. K# h' apip uninstall pycryptodemo6 X9 B2 |  n5 M# E4 p# m
# 重新安装依赖包+ S  `1 s$ i' g$ v+ j1 \; p$ n
pip install pycrypto
" J+ F6 r1 p1 [# }. x4 ppip install pycryptodemo
. K  l2 L2 _$ I% K' F0 }3 o) kpip install -e .
( |& }% Y6 J- W7 d: w+ E9 k错误二; t5 A! m! m  f. A
......
1 U0 Y$ G1 |, Q  |$ CTraceback (most recent call last):$ v0 x& z3 C, U8 Q9 O" z9 ^
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in ' X- Y# |5 ]/ w& G0 p
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()9 e4 A- g& }9 o, C. W
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main
2 I6 {' E5 ?. m% p9 r+ P2 J& j    settings.setup_privnet(args.privnet), p9 j, N+ N0 G
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet6 ~8 D% ]* M, ^" n5 P) @$ M
    self.check_privatenet()
& z7 t3 i5 h% o! J+ \7 [  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet" v# I. y& H' p, z2 q
    version = client.get_version()
. \6 G9 I/ {( k# I( p  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
- j! c, y. C( C    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
+ M$ \' I* [5 W' z/ |  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
- y* }& c$ o5 @1 X3 s0 {    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
' C* b: q! J8 _2 J! i0 Wneorpc.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',))6 E6 |# h) B: [2 z6 Q
说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2