Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

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

天道唯
2391 0 0
NEO是一个非盈利的社区化的区块链项目,是利用区块链技术和数字身份进行资产数字化,利用智能合约对数字资产进行自动化管理,实现“智能经济”的一种分布式网络,被称为“中国以太坊”。本文将带领大家学习如何使用Python编写NEO智能合约。
0 J! L& D5 M! Z( Q( h( {3 P  ^7 @0 j% L: l9 y
5 c6 |) q1 ]5 x  C* g1 |
环境搭建
# c! F8 J) v' d7 j基于macOS或Ubuntu,windows用户请自备虚拟机。# ]! n/ G8 o. B7 Z' m
安装Docker及拉取镜像
- w$ _$ b! M/ O4 K1 f4 zmacOS:: g: V' s8 B0 |. ^8 u- s
1.点我去下载,下载后安装并启动,启动成功后任务栏会有个Docker的图标,点击可以查看运行状态1 F& W/ [0 n, }3 g
3 }& V# [* s5 e  g' w( U- i% r0 n
2.拉取私链镜像,打开终端执行1 f7 E0 j7 z. ^1 \
docker pull cityofzion/neo-privatenet( R/ U6 V: o- l# [& F5 j/ y5 s
) d  D1 O5 ^% Y2 p! X  T
Tip:由于国内环境问题,docker镜像的拉取往往会非常慢,所以我们可以配置一些国内的镜像加速,如DaoCloud的Docker 加速器,免费注册一下,按照说明配置即可,非常简单和方便。
% |: Q. y( e& s, D+ j* I) h3.运行Docker容器,执行
; Z& k7 u& ?! |3 SUbuntu:
4 z8 v, V3 U+ S# ~7 o1.安装Docker,执行1 V" z7 L# B, m) D% L
sudo apt install docker.io4 A4 t& q' Q7 @1 k
2.启动Docker,执行(安装成功后应该会默认已启动)% ~! |4 {1 ]2 S1 R5 D8 C" {2 v  k
sudo service docker start
" B, O* j8 |# y9 A- Y  ~, f3.拉取私有链网络镜像,执行6 [7 I, e+ x* ?& w8 y( V2 {
sudo docker pull cityofzion/neo-privatenet
  z, J3 d/ \8 n4 U" ~+ B% v- ~4.运行docker容器,执行
5 Z- y; _  K; f8 wsudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet) Q. x1 _: c6 \9 K- W, m
安装Python3和levelDB
8 Z. @- q4 z1 O" _# f% r  K' [macOS:
+ h6 m: F6 j$ c没有安装过Homebrew的请先执行下面的命令,已安装的忽略。) R3 I; o" B1 P
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
" Q5 N; D7 \) b2 n, C; q! s1.macOS是自带Python2的,我们需要安装Python3! }0 G' A* Z9 ~- a( u* T' D' f
brew install python3
" R8 f! w( l9 M0 t, c2.安装levelDB
0 B4 Y' ~- k2 W" _3 vbrew install leveldb* A& u: E- G. S, P* N
Ubuntu:+ S' h1 f+ w, e& {: e* X2 Y7 L* k* B
简单粗暴的依次执行下面命令:
6 b# n; e" G3 g6 B" G6 u+ |sudo apt install software-properties-common python-software-properties
5 {1 L- w. Z6 G1 X# x1 Xsudo add-apt-repository ppa:deadsnakes/ppa
  S% m' T+ K) g* L* y2 U  I- esudo apt update1 d+ H0 x. @/ [" ~. M% Y
sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++) m0 ]0 D2 B( Y- E6 |& B; _
Tip:因为NEO最低需要Python3.6的环境,Homebrew是会安装最新版本的Python,而apt-get源上直接install python3安装的是python3.5,所以这里我们指定的python3.6。( E2 D) \5 O: c/ w, J0 Y
neo-python
' O. I6 s. F3 Z从GitHub克隆neo-python项目
+ d- I- j! u5 A: u+ r  A3 g9 }6 Ygit clone https://github.com/CityOfZion/neo-python.git
6 Y# e* D0 \  R5 d; b5 t创建并进入虚拟环境
. R3 Z+ Y* |+ e1 I5 bcd neo-python3 {. b5 k/ \. W* \
python3 -m venv venv # 创建虚拟环境,Ubuntu这里使用 python3.6 -m venv venv
  n$ W2 a+ O: b, Zsource venv/bin/activate # 进入虚拟环境,退出虚拟环境使用命令 deactivate
( z" s& U* w4 R+ ^- o安装依赖包9 `9 S) ^5 D. T$ t3 [
pip install -r requirements.txt* R) a0 a; [/ P9 a
pip install -e .& l4 j- M6 z4 d  U) N  h) u; r
启动连接到私有链网络,进入NEO cli命令行) }- F0 a$ ^' m) n0 c5 H
np-prompt -p # 退出命令行 在命令行输入 quit6 ~# v& s1 o( ?. x
+ {! b5 {. d1 c: ?( W4 `
出现如下界面进入了NEO命令行,那么恭喜你已经成功搭建好所有环境,如果你报错了,请接着往下看。" d+ }9 k& l- k* a/ E1 V$ j
np-prompt -p 可能出现的错误
/ }; v1 n) I6 r. N8 M) W错误一
9 }3 h# F4 k  P
) I, W& |$ F$ y' l+ ~: l
Traceback (most recent call last):
/ x; H1 F6 M4 Q5 {9 @  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in
# w) M3 J1 U7 o6 A7 \6 a2 ?    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
+ l' s2 s4 v; G. f) y, e  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point  \2 k6 `  ]  p( y) T
    return get_distribution(dist).load_entry_point(group, name)# _; y( l  Y& F1 Y! @- w# E( R
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
) U1 ]9 M5 }; N  e* o, H: K, d3 x    return ep.load()* \8 ~$ @: \; _$ B( e' X  @
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load5 ^4 v6 m7 p8 Y1 @
    return self.resolve()) [/ t  ]- Z4 Z4 R2 ^/ G
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
; Z) H+ G' e* l    module = __import__(self.module_name, fromlist=['__name__'], level=0)
: [' s: X7 d1 b, z6 p: Z  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in
$ N: Z+ T& ?  n! J) U  g: u( x; A: M    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet1 i, u3 i6 E; j" A$ r$ f8 X
  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in - E. `- }! w. q% F! d; b
    from neo.Wallets.Wallet import Wallet9 v9 R4 e9 l' V7 x
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in
. s0 R) d1 ]# x( [8 a3 k8 A9 _    from Crypto.Cipher import AES
7 d# X* K6 e8 \( a9 y  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in
) o+ ^% G0 a* P6 ~& p    from Crypto.Cipher._mode_ecb import _create_ecb_cipher
6 a' u6 ~" ?) |% y/ ~5 @8 ?7 k  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in
( s8 g! {. G! s$ d- a    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,( R/ y  c) h2 q1 [- H  w
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in / r% }& e, B) O
    from Crypto.Util.py3compat import byte_string
9 R, c# a. P1 g0 aImportError: cannot import name 'byte_string'& B0 X4 j8 {. _6 ?
这是因为依赖包的版本问题,解决方案如下
7 b& S: X6 z9 e. A4 Z) v# 卸载依赖包
$ {3 W; C/ f( c1 q' Ipip uninstall pycrypto
0 v5 s" `) e- O6 N# c& E3 upip uninstall pycryptodemo
4 g  b, C& P% z# 重新安装依赖包
, }: @+ \2 \" U5 c5 ?: y4 Ppip install pycrypto
3 {6 Z7 O" `7 n. ~2 {2 |pip install pycryptodemo, v  K' x, x" O; ~
pip install -e .
" x6 ^# Z4 v6 C+ g错误二
4 x% z# f& a5 |( j, d0 ?. y! J....... q- s! T. _% d
Traceback (most recent call last):  i- F4 M% @: r- l; ?
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in 4 v2 ~0 t5 n: Z6 `, U: c
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
$ ?4 d4 e& y. i+ o; b% F  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main
7 f" G0 K5 ^' V$ @# t  s: L- ~; Y    settings.setup_privnet(args.privnet)6 o* u7 R' Z9 q$ k
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet, @0 R% B" X) S) |* o
    self.check_privatenet()
$ H; n8 m* u1 l! W  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet
! `; F9 L" }# l1 n$ W    version = client.get_version()
0 `" P8 L% x! y+ Q4 k7 b. ]  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
$ A% v( D- O' N* H! V* q    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)) {# `$ d0 K# d2 z$ v( F
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
4 u: O  X9 G! Y1 }+ F, i    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))9 G, ^  U: l1 d# y1 S
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',))# D8 m( l  Z- ]3 J6 ^/ c( j; C1 ~) S
说明你没有启动docker容器并进行端口映射,请看第一部分安装Docker及拉取镜像
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

天道唯 小学生
  • 粉丝

    0

  • 关注

    2

  • 主题

    2