NEO區(qū)塊鏈-Python編寫智能合約(一)環(huán)境搭建

NEO是一個(gè)非盈利的社區(qū)化的區(qū)塊鏈項(xiàng)目,是利用區(qū)塊鏈技術(shù)和數(shù)字身份進(jìn)行資產(chǎn)數(shù)字化,利用智能合約對(duì)數(shù)字資產(chǎn)進(jìn)行自動(dòng)化管理,實(shí)現(xiàn)“智能經(jīng)濟(jì)”的一種分布式網(wǎng)絡(luò),被稱為“中國(guó)以太坊”。本文將帶領(lǐng)大家學(xué)習(xí)如何使用Python編寫NEO智能合約。
更多介紹移步NEO官網(wǎng)NEO 白皮書

感謝NEO Workshop Steve 葉凡的分享

環(huán)境搭建

基于macOS或Ubuntu,windows用戶請(qǐng)自備虛擬機(jī)。

安裝Docker及拉取鏡像

  • macOS:
    1.點(diǎn)我去下載,下載后安裝并啟動(dòng),啟動(dòng)成功后任務(wù)欄會(huì)有個(gè)Docker的圖標(biāo),點(diǎn)擊可以查看運(yùn)行狀態(tài)
    image

    2.拉取私鏈鏡像,打開終端執(zhí)行
docker pull cityofzion/neo-privatenet

Tip:由于國(guó)內(nèi)環(huán)境問題,docker鏡像的拉取往往會(huì)非常慢,所以我們可以配置一些國(guó)內(nèi)的鏡像加速,如DaoCloudDocker 加速器,免費(fèi)注冊(cè)一下,按照說明配置即可,非常簡(jiǎn)單和方便。


image

3.運(yùn)行Docker容器,執(zhí)行

docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet
  • Ubuntu:
    1.安裝Docker,執(zhí)行
sudo apt install docker.io

2.啟動(dòng)Docker,執(zhí)行(安裝成功后應(yīng)該會(huì)默認(rèn)已啟動(dòng))

sudo service docker start

3.拉取私有鏈網(wǎng)絡(luò)鏡像,執(zhí)行

sudo docker pull cityofzion/neo-privatenet

4.運(yùn)行docker容器,執(zhí)行

sudo docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet

安裝Python3和levelDB

  • macOS:
    沒有安裝過Homebrew的請(qǐng)先執(zhí)行下面的命令,已安裝的忽略。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

1.macOS是自帶Python2的,我們需要安裝Python3

brew install python3

2.安裝levelDB

brew install leveldb
  • Ubuntu:
    簡(jiǎn)單粗暴的依次執(zhí)行下面命令:
sudo apt install software-properties-common python-software-properties
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++

Tip:因?yàn)?strong>NEO最低需要Python3.6的環(huán)境,Homebrew是會(huì)安裝最新版本的Python,而apt-get源上直接install python3安裝的是python3.5,所以這里我們指定的python3.6。


neo-python

  • 從GitHub克隆neo-python項(xiàng)目
git clone https://github.com/CityOfZion/neo-python.git
  • 創(chuàng)建并進(jìn)入虛擬環(huán)境
cd neo-python
python3 -m venv venv # 創(chuàng)建虛擬環(huán)境,Ubuntu這里使用 python3.6 -m venv venv
source venv/bin/activate # 進(jìn)入虛擬環(huán)境,退出虛擬環(huán)境使用命令 deactivate
  • 安裝依賴包
pip install -r requirements.txt
pip install -e .
  • 啟動(dòng)連接到私有鏈網(wǎng)絡(luò),進(jìn)入NEO cli命令行
np-prompt -p # 退出命令行 在命令行輸入 quit

出現(xiàn)如下界面進(jìn)入了NEO命令行,那么恭喜你已經(jīng)成功搭建好所有環(huán)境,如果你報(bào)錯(cuò)了,請(qǐng)接著往下看。

  • np-prompt -p 可能出現(xiàn)的錯(cuò)誤
    錯(cuò)誤一
Traceback (most recent call last):
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in <module>
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
    return ep.load()
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
    return self.resolve()
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 28, in <module>
    from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
  File "/home/parallels/Code/neosc/neo-python/neo/Implementations/Wallets/peewee/UserWallet.py", line 8, in <module>
    from neo.Wallets.Wallet import Wallet
  File "/home/parallels/Code/neosc/neo-python/neo/Wallets/Wallet.py", line 13, in <module>
    from Crypto.Cipher import AES
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/__init__.py", line 3, in <module>
    from Crypto.Cipher._mode_ecb import _create_ecb_cipher
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Cipher/_mode_ecb.py", line 29, in <module>
    from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/Crypto/Util/_raw_api.py", line 32, in <module>
    from Crypto.Util.py3compat import byte_string
ImportError: cannot import name 'byte_string'

這是因?yàn)橐蕾嚢陌姹締栴},解決方案如下

# 卸載依賴包
pip uninstall pycrypto
pip uninstall pycryptodemo
# 重新安裝依賴包
pip install pycrypto
pip install pycryptodemo
pip install -e .

錯(cuò)誤二

......
Traceback (most recent call last):
  File "/home/parallels/Code/neosc/neo-python/venv/bin/np-prompt", line 11, in <module>
    load_entry_point('neo-python', 'console_scripts', 'np-prompt')()
  File "/home/parallels/Code/neosc/neo-python/neo/bin/prompt.py", line 1061, in main
    settings.setup_privnet(args.privnet)
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 228, in setup_privnet
    self.check_privatenet()
  File "/home/parallels/Code/neosc/neo-python/neo/Settings.py", line 314, in check_privatenet
    version = client.get_version()
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 283, in get_version
    return self._call_endpoint(GET_VERSION, id=id, endpoint=endpoint)
  File "/home/parallels/Code/neosc/neo-python/venv/lib/python3.6/site-packages/neorpc/Client.py", line 310, in _call_endpoint
    raise NEORPCException("Could not call method %s with endpoint: %s : %s " % (method, endpoint.addr, e))
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('<urllib3.connection.HTTPConnection object at 0x7f14dee4b9b0>: Failed to establish a new connection: [Errno 111] Connection refused',))

說明你沒有啟動(dòng)docker容器并進(jìn)行端口映射,請(qǐng)看第一部分安裝Docker及拉取鏡像


下一篇將帶領(lǐng)大家編寫和部署智能合約到區(qū)塊鏈上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容