对于Vyper的全面指南,这是一种新的以太坊谈话
Vyper的是一个通用的,推行性的编程谈话,编译成EVM(复仇造谣机)字节码一样,密实度。然则,Vyper旨在大规模简化历程,以便创建更易于透露的智能合约,这些合同对通盘相关方愈加透明,何况报复的进口点更少。
任何针对EVM的代码皆必须是超高效的,以最大限度地减少智能合约实施所需的气体,因为与低效代码的合同实质上需要更多的以太实施,何况可能很快变得绝顶崇高,尤其是在微处理器等用例中往复。最终的后果是Vyper看起来在逻辑上肖似于Solidity,在语法上肖似于Python,然则莫得许多面向对象的编程轨范 - 可能需要为事务编程提供新的轨范界说。
面前学习这些逻辑和语法上的互异将有助于您成为全国级的Vyper拓荒东说念主员,因为完毕2023年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合约最先包含的是合同存储字段imtoken钱包官方网站,举例令牌余额映射:
均衡:众人(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看望imtoken钱包官方网站,因此(有点肖似于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内的瓜代imtoken钱包官方网站,在最简便的例子中可能。
运行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用具和资源imtoken钱包官方网站
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接口编写一个翻译器。
该提案指出,资金“税”将在今年5月至11月之间应用。它每天可能会抽出多达112.5个BCH来为开发人员提供资金,这意味着相当于不到700万美元的资金最终将支持以比特币现金为基础的开发商。
据称,由于佩特罗得到委内瑞拉石油储备的支持,根据政府的说法,Redditor指出0.5 PTR的价值为30美元,因为一个佩特罗的价格相当于一桶原油。
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.完结这么的里面调用:将函数参数添加到堆栈 - > 调用里面功能 - >作念功能的东西。
从咱们编写的代码中不错看出imtoken钱包官方网站,Vyper在拓荒过程中取得了很大的逾越 ,何况唯有一些主要的更新(剖释为上头的小门径) 直到1.0发布!