关于Vyper的全面指南,这是一种新的以太坊语言
Vyper的是一个通用的,实验性的编程语言,编译成EVM(复仇虚拟机)字节码一样,密实度。但是,Vyper旨在大规模简化流程,以便创建更易于理解的智能合约,这些合同对所有相关方更加透明,并且攻击的入口点更少。
任何针对EVM的代码都必须是超高效的,以最大限度地减少智能合约执行所需的气体,因为与低效代码的合同实际上需要更多的以太执行,并且可能很快变得非常昂贵,尤其是在微处理器等用例中交易。最终的结果是Vyper看起来在逻辑上类似于Solidity,在语法上类似于Python,但是没有很多面向对象的编程范例 - 可能需要为事务编程提供新的范例定义。
现在学习这些逻辑和语法上的差异将有助于您成为世界级的Vyper开发人员,因为截至2018年6月,Vyper仍处于v0.1.0-beta.1版本!
了解Vyper 0.比较Python,Vyper和Solidity
在这里,我们介绍了Vyper的高级“原因” - 为我们分析和编写Vyper代码提供了一个重点,包括智能合约。
关键改进1:简单
Vyper不包含大多数程序员熟悉的许多构造:类继承,函数重载,运算符重载和递归。对于图灵完备语言而言,这些都不是技术上必需的,并且它们通过增加复杂性来代表安全风险。由于这种复杂性,这些结构将使得智能合约难以理解并由非专业人员进行审计,如在Solidity合同中所见。
不常见的不常见的构造是修饰符(这使得编写误导性代码变得容易),内联汇编(这会破坏Ctrl + F)和二进制固定点(二进制固定点通常需要近似值)。
关键改进2:安全
用Vyper开发者自己的话说,Vyper“如果为了提高安全性的目标,它会故意禁止事情或使事情变得更难。”
因此,Vyper并不是Solidity的全部替代品,而是一种在安全性至关重要的地方使用的优秀语言,例如用于处理患者健康元数据的智能合约或用于分散 AI的模型渐变。
Vyper代码和语法差异
Vyper的构建尽可能与Python类似,同时努力实现安全性和简单性的目标,因此语言的整体感觉是相同的,尽管有许多不同之处需要注意。
执行文件
虽然Python脚本被执行为
python file_name 。PY
,使用编译vyper脚本
vyper file_name 。vy 。
状态变量
状态变量是永久存储在合同存储中的值,可以是任何类型,例如:
exampleStateVariable:int256 。
制图
Vyper合约首先包含的是合同存储字段,例如令牌余额映射:
平衡:公共(wei_value [地址])
这是一个定义键和相应值的状态变量。
Vyper映射基本上是初始化的哈希表,如上所示,所以“每个可能的密钥都存在,并映射到一个字节表示全为零的值:一个类型的默认值。”
关键数据不存储在映射中,而只是存储在keccak256哈希中以查找其值。
在定义balance时,给出了类型public(),然后是映射语法:首先给出wei_value的值类型,然后是方括号中的键(地址) - 类似于Python对数组的处理。
定义
您会注意到Vyper在定义名称(如balance)时使用冒号而不是Python的等号,尽管Python 3.6包含与变量注释相同的语法:
context = {} #empty dictionary context [“a”]:2#annotate dictionary variable
冒号语法用于变量注释,冒号用作赋值运算符,仅指定类型注释。Vyper使用此语法进行真值赋值。
整数类型
Vyper只有两种整数类型:uint256(对于非负整数)和int128(对于有符号整数) - 与Solidity的uint8到uint256的步长为8,而对于int8到int256则相同(这意味着int类型有64个不同的关键字) )。
布尔运算符,运算符,比较和函数
对于大多数运营商而言,Vyper与Python的语法几乎相同,包括:
真与假的布尔值; 不,和,或,==,和 !=运营商; <,<= ,==,!=,> =,和 >比较; 和 +,- ,*,/,**,和 %算术运算符(仅用于 int128)
以及一些类似的内置函数:
len(x)返回int的长度; floor(x)将小数舍入到最接近的int ; 和 ceil(x)将十进制数舍入到最近的int
还有一些新的:
sha3(x)将sha3 哈希作为字节32 返回 ; concat(x,...)连接多个输入; slice(x,start = _start,len = _len)从_start开始返回 _len的切片
清单
Vyper中的列表使用格式_name:_ValueType [_Integer ]声明,而设置值和返回语句的语法与Py = thon相同。
例如:
lst:int128 [ 3 ] #define list lst = [ 1,2,3 ] #set values lst [2] = 5#通过索引设置一个值返回lst [0]#返回1
结构
结构是您定义的类型,组变量,并使用struct.argname访问,因此(有点类似于Python词典):
struct:{ #define struct arg1:int128,arg2:decimal 结构。arg1 = 1 #access arg1 in struct
定义方法
方法(Vyper中的契约方法)在Python和Vyper中以相同的方式定义:
def 方法(): 做一点事()
除了Python提供的功能之外,Vyper还包括以太网特定的装饰器,例如@payable和@asser t - 前者用于使合同能够进行事务,后者用于表示布尔表达式:
注意def function_name(arg1,arg2,..., argx ) - > output:用于定义函数的语法。与Python不同,Vyper在 - >之后明确定义def行中的输出类型。
构造函数
构造函数遵循与Python相同的约定,并在区块链上实例化给定的契约和参数。init初始化程序并且只执行一次。例如:
@public def __init __(_ name:bytes32,_decimals:uint256,_initialSupply:uint256): 自我。name = _name self 。小数= _decimals 自我。totalSupply = uint256_mul(_initialSupply,uint256_exp(convert(5,'uint256'),_ decimals))
与在Python中一样,self用于断言实例变量。上面的函数使用@public装饰器进行修饰,以使其具有公共可见性,并允许外部实体调用它(与默认值相反 - 或者省略装饰器 - 这是私有的)。
装饰器@constant用于装饰只读取状态的方法,而@payable使任何方法都可以通过付款来调用。
活动
您可以在索引结构中使用__log__记录事件,如下所示:
付款:__ log __({amount:uint256,param2:indexed(address)})tot_payment:uint256 @public def pay(): 自我。tot_payment + = msg 。价值记录。付款(MSG 。值,味精。发送者)
写Vyper合同
现在,让我们写一些简单的智能合约。以下代码段允许合同接收NFT(不可替代的令牌)并能够针对该令牌发送。
@public def safeTransferFrom(_from:address,_to:address,_tokenId:uint256): 自我。_validateTransferFrom(_from,_to,_tokenId,味精。发送方)自。_doTransfer(_from,_to,_tokenId)如果(_to 。 codesize > 0): 的returnValue:字节 [ 4 ] = raw_call(_to,' xf0xb9xe5xba ',特大= 4,气体= MSG 。气体) 断言 returnValue == ' xf0xb9xe5xba '
下面演示了@public装饰器,定义了一个具有显式赋予类型的单个参数的函数,以及一个简单的代码体,它使用assert语句验证用户是否有权作为“使用委托投票”程序的一部分进行投票:
#给选民投票的权利#这可能只能由主席@public def give_right_to_vote(选民:地址)调用: 断言味精。发件人== 自我。主席#throw如果发件人不是主席断言不是self.voters [voter] .voted#throw如果选民已经投票断言self.voters [选民] .weight == 0#throw如果选民的投票权重不是0 自我。选民[选民] 。重量= 1 自我。voter_count + = 1
在讨论了语法和逻辑区别之后,代码并不太令人生畏。vyper.online提供“使用委托投票”程序的完整源代码,使用结构选民和提案,以及以下恰当命名的函数:
DEF 委派(ADDR:地址)- > BOOL DEF directly_voted(ADDR:地址)- > BOOL DEF __init__(_proposalNames:bytes32 [ 2 ])DEF give_right_to_vote(选举人:地址)DEF forward_weight(delegate_with_weight_to_forward:地址)DEF 委派(到:地址)def vote(建议:int128)def winner_proposal()- > int128 def winner_name()- > bytes32
与任何编程语言一样,事先规划出主要结构(在本例中为函数契约)会使编程变得更加容易。要记住Vyper的主要区别是缺乏OOP范例。在当前的开发阶段,您还无法进行外部代码调用。
允许外部代码调用的注意事项可以在以下开发建议中看到:
#外部合同A:
def foo():constant def bar():修改#这个合同合同B:a:一个def baz():a.foo()a.bar()
合同B呼吁合同A,包括A内的方法,在最简单的例子中可能。
运行Vyper
要继续编写代码,请转到vyper.online,并在“源代码”选项卡下编写代码示例,并在准备好后单击“编译”。Vyper实现和测试执行最常用的客户端(虽然在pre-alpha中)是Py-EVM,最初由Vitalik自己开发,允许用户在不更改核心库的情况下添加操作码或修改现有操作码,从而实现更大的模块化和可扩展性比典型的客户端。
要获得Py-EVM,只需使用pip install py-evm == 0.2.0a16。
3A。部署Vyper合同
虽然Py-EVM目前处于pre-alpha状态并且可能难以启动和运行,但有两种更简单的替代方法可以将Vyper合同部署到公共testnet(以及奖励):
1)将从vyper.online生成的字节码粘贴到Mist或geth中
2)使用myetherwallet合约菜单在当前浏览器中部署3)(即将推出)
在未来,Vyper将与 populus 集成,允许您轻松部署Vyper合同
为简单起见,我们将使用选项(1)和Mist(基于geth而不是基于终端的geth的新UI)来部署合同。由于Vyper编译为与Solidity相同的字节码,因此我们不需要任何特定于Vyper的客户端,并且可以遵循这些稍微迂回的步骤:
- 转到vyper.online并在预先填写的投票“源代码”上单击“编译”
- 复制“字节码”选项卡下的所有内容
- 如果您还没有为您的操作系统安装Mist
- 允许节点下载和同步(这会自动发生)
- 在雾设置中选择“使用测试网络”
- 创建一个密码(记住它......)
- 输入合同
- 在Mist界面中选择“Contracts”
- 选择“部署新合同”
- 转到“合同字节代码”选项卡
- 粘贴您从vyper.online复制的字节码
部署合同
- 选择“DEPLOY”并输入之前的密码
- 确认已部署Vyper合同
- 转到Mist中的“Wallets”选项卡
- 向下滚动到“最新交易”
- 你应该看到我们刚刚部署的合同!
* 虽然在“创建合同”状态,因为它没有被挖掘和验证
结论
本指南提供了对Vyper的逻辑和语法介绍,允许我们开始编程和部署合同。根据本指南的知识,您应该能够为Vyper及其文档的开发做出贡献,并继续通过vyper.online编码来学习。
同样,Vyper并不意味着取代Solidity,但正如一项研究发现超过34,000份易受攻击的合同,在这个空间中对更强安全性的需求比以往任何时候都更大,这使得Vyper成为以太坊的重要未来
进一步阅读和路线图
由于Vyper仍在进行实验开发,官方文档和GitHub是最全面的资源,以下提供的价值:
01. Vyper的社区Gitter
02. Vyper工具和资源
03. Vyper上的 “ 以太坊书”页面
04. 研究:“大规模发现贪婪,浪子和自杀合同”
05. “循序渐进指南:以太坊薄雾钱包入门”
07. 测试和部署Vyper合同
08.“ 建立你的第一个完整的以太坊智能合约 - 教程” [推广 适合Vyper的步骤非常简单]
Vyper的1.0版开发步骤侧重于接口(以及内部和外部调用的改进等),它们定义了约束,因此您可以与实现该接口的任何对象进行通信。接口支持升级智能合约的替代解决方案,因此它们不是基本功能所必需的,您可以在Vyper中开始编码,尽管语言不完整。
版本1.0的开发路线图,从Vyper的gitter中检索和编辑:
01.两种类型的文件:接口(每个文件一个接口)和合同(一个合同每个文件)。
02.您可以在接口文件中定义类似ERC721Metadata的接口合同文件。
03.接口文件是与Ethereum ABI完全兼容的一对一。
04.从Solidity到Vyper接口编写一个翻译器。
05.建立所有最终ERC接口的库,即使你必须手动制作他们。
06.Import接口文件到合同的接口。
07.接口是一种装饰地址的类型。
08.接口可以继承其他接口。
09.仔细研究ERC-165的界面ID,并重现上面给出的例子
ERC-721这涉及接口如何继承其他接口。
10.接口可以具有可选功能。(打破坚固。)
11.合同可以实现接口。
12.实现接口但未实现所需的接口的合同功能是一个错误。
13.实现接口但未实现可选的合同
功能既不是ERROR也不是警告。
14.将@public重命名为@external以匹配Solidity。
15.引入一个新的函数装饰器@internal,它允许调用一个函数内部。
16.重新引入当前用于外部调用的函数调用语法(删除步骤14)但它适用于内部呼叫。
17.像这样实现外部调用:外部跳转调用表 - > LOADCALLDATA unpack - >将函数参数添加到堆栈 - >调用内部函数 - >执行函数东西。
18.实现这样的内部调用:将函数参数添加到堆栈 - > 调用内部功能 - >做功能的东西。
从我们编写的代码中可以看出,Vyper在开发过程中取得了很大的进步 ,并且只有一些主要的更新(分解为上面的小步骤) 直到1.0发布!
本文链接地址:https://www.wwsww.cn/ytf/1069.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。