上一篇 Vyper 编译部署合约 的最后,我们提到了在开发智能合约过程中,为了更方便的即时部署和测试,我们需要一个智能合约开发、测试框架:truffle。本文就将简单的介绍如何使用truffle快速的在本地测试Vyper合约。
Truffle 是一个在以太坊进行 DApp 开发的应用最广泛的开发、测试框架。详细学习可以参见 官方文档。
npm install -g truffle
Truffle 5 提供了Vyper语言的支持,如果你使用的版本低于5.0,请更新。同时你需要搭建好vyper开发环境,如果你还没有安装vyper请看 Vyper教程 开发环境搭建。
如果你是将Vyper安装在虚拟Python环境当中,别忘记进入虚拟环境:
source vyper-venv/bin/activate
(vyper-venv) $ mkdir example
(vyper-venv) $ cd example
(vyper-venv) $ truffle init
Starting unbox...
=================
✔ Preparing to download box
✔ Downloading
✔ cleaning up temporary files
✔ Setting up box
Unbox successful, sweet!
Commands:
Compile: truffle compile
Migrate: truffle migrate
Test contracts: truffle test
你会看到这样的目录结构:
进入工作目录,下载vyper-example项目
(vyper-venv) $ truffle unbox vyper-example
也可以使用 truffle unbox 命令下载其他的 Box
这个示例项目包含两个合约,其中一个Migrations.sol文件是truffle框架默认的部署合约,必须有这个合约才能进行部署功能。我们只用关心VyperStorage.vy这个文件即可。
#VyperStorage.vy
stored_data: uint256
@public
def set(new_value : uint256):
self.stored_data = new_value
@public
@constant
def get() -> uint256:
return self.stored_data
这个合约实现了set(uint256) 和 get() 两个函数分别用来储存一个数值和读取储存的值。
你可以直接使用truffle compile
truffle migrate
truffle test
命令来编译、部署、测试合约。部署的前提是你需要有可用以太坊客户端(例如Ganache 或 geth)和连接到可用的以太坊的网络。
为了更方便的本地部署和测试,可以直接使用与框架集成的 develop 链进行本地测试。
(vyper-venv) $ cd vyper-example
(vyper-venv) $ truffle develop
Connected to existing Truffle Develop session at http://127.0.0.1:9545/
truffle(develop)>
进入控制台后,大部分命令可以省去“truffle”。
truffle console
和truffle develop
命令都可以进入truffle控制台。当你需要部署你的合约到以太坊的测试网络或者主网络时使用truffle console
,同时你必须有自己的以太坊客户端。而truffle develop
会在你的本地启动一个develop 链来让你本地测试你的合约,不需要拥有以太坊客户端,会使用develop的默认账号。
需要注意的是 如果你有正在运行的 truffle develop。这条命令不会生成新的develop链,而是去连接正在运行的区块链。
truffle(develop)> compile
Compiling your contracts...
===========================
> Compiling ./contracts/Migrations.sol
> Artifacts written to /Users/lihanlin/Workspace/vyper/truffle-example/build/contracts
> Compiled successfully using:
- solc: 0.5.16+commit.9c3226ce.Emscripten.clang
编译会生成 build文件夹,里面存放了合约的ABI文件。
truffle(develop)> migrate
......
Summary
=======
> Total deployments: 2
> Final cost:
VyperStorage.vy合约已经部署好了!
如果你更新了你的合约想在develop链上,重新部署它,请使用
truffle(develop)> migrate --reset
在真正的以太坊区块链上一旦你部署了合约,就无法再更新它了
我们可以直接在控制台中调用合约函数进行测试:
VyperStorage.deployed().then((token) => {contract = token;})
contract.set(1)
contract.get(0)
执行结果如下:
truffle(develop)> VyperStorage.deployed().then((token) => {contract = token;})
undefined
truffle(develop)> contract.set(88)
{
tx: '0x7db42d24b78a6811b4582062ebd282dd70349758b501ab655cd0ef710e43d927',
receipt: {
transactionHash: '0x7db42d24b78a6811b4582062ebd282dd70349758b501ab655cd0ef710e43d927',
transactionIndex: 0,
blockHash: '0x559e3b59a8e0d9b910b6e660e018dd471f33f04105d1eb14409e1f95088b948b',
blockNumber: 15,
from: '0x26fbfb767f1eb67194d12f2e5fe869c7b2ac3697',
to: '0xa097cd36eff8a1c794da69f2dae230a30e61c5d6',
gasUsed: 41360,
cumulativeGasUsed: 41360,
contractAddress: null,
logs: [],
status: true,
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
rawLogs: []
},
logs: []
}
truffle(develop)> contract.get()
BN { negative: 0, words: [ 88, <1 empty item> ], length: 1, red: null }
可以看到我们顺利的存储了88这个数并把它读了出来。
本文只是简单的介绍了truffle的基础功能,truffle还有很多强大的功能,如果你想用好它们,请学习官方文档。
下一篇 Vyper教程 安全的编程