上一篇 Vyper教程 开发环境搭建 中我们搭建好了开发环境。
本文将带领大家写出我们的第一个Vyper合约。
合约简单的实现往合约中存储以太坊和从合约中取出以太坊的功能(一个类似钱包的智能合约)。接下来我们将用Vyper来实现这个合约,从而了解vyper的一些基础知识。
Vyper中的合约包含在文件中,每个文件都是一个智能合同。Vyper中的文件类似于面向对象语言中的类。
创建文件wallet.vy
和python一样,#符号代表注释
# @version 0.1.0b17
Vyper支持版本编译指示,该编译指示用于拒绝使用可能引入不兼容更改的将来的编译器版本进行编译。
状态变量是永久存储在合同存储中的值, 必须在在任何函数之外声明。这里我们声明一个整数变量value,用于储存合约中的以太坊的数量。
value: wei_value
变量有多种类型,具体参见"类型"部分。一般的数字用int128类型,wei_value是Vyper中内置的类型(基于uint256)来表示以太坊的数量。
接下来编写我们的第一个函数,从合约中取出金额。
@public
def withdraw(_amount: wei_value):
assert _amount <= self.value
self.value -= _amount
send(msg.sender, _amount)
函数名为 withdraw,它接收一个整数(wei_value)名为_amount的参数,作为取款金额的数量。
函数用@public装饰,表示公有函数,意味着它仅可以被外部调用,与绝大多数其他语言不同的是它不能被内部调用。私有函数用@private装饰,其他的修饰符参考官方文档函数部分。
函数体中我们先用 assert函数判断取款金额不能超过存储的金额,否则 assert 函数将导致合约执行停止并失败。
之后我们把储存金额余额的变量value中减去取出的金额_amount。
最后想提款的地址(也就是这个提款申请的发送者:msg.sender)发送_amount数量的wei,这里我们使用了合约为我们提供的内置变量msg,可用通过msg.sender获取交易发送者的地址,通过msg.value获取交易发送的以太坊的数量。
msg.sender和msg.value只能从公共函数访问. 如果在私有函数中需要这些值,则必须将它们作为参数传递.
接下来我们写接收以太坊的函数pay:
@public
@payable
def pay():
self.value += msg.value
@payable修饰允许函数接收以太坊,同时函数将接收到的以太坊的数量加到value变量中。
我们合约还需要一个构造函数:
@public
@payable
def __init__():
self.value = msg.value
构造函数在部署合约的时候执行。
最终我们的合约编写完成了wallet.vy:
# @version 0.1.0b17
value: wei_value
@public
@payable
def __init__():
self.value = msg.value
@public
def withdraw(_amount: wei_value):
assert _amount <= self.value
self.value -= _amount
send(msg.sender, _amount)
@public
@payable
def pay():
self.value += msg.value
接下来我们将尝试编译部署这个合约!
下一篇 Vyper教程 编译部署合约