ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:34.73KB ,
资源ID:22961121      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22961121.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编写智能合约Word文件下载.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编写智能合约Word文件下载.docx

1、这里,修改器检测合约所有者是否在调用函数。如果不是,就抛出异常。5)得到合约构造函数(constructor)o在部署合约时,调用构造函数构造函数用于初始化状 态变量。6)定义两个方法。第一个方法用于得到data状态变量的值,第二个方法用于改变data的 值。在更深入地学习智能合约的函数之前,我们先来学习一些与Solidity有关的其他知识,然后 再回答合约。3数据位置截止目前,我们学过的所有编程语言可能都把变量存储在内存中。但是在Solidity中,根据 情况的不同,变量可能不存储在内存和文件系统中。根据情况的不同,数据总有一个默认位置。但是对于复杂数据类型,例如字符串(string).数

2、组(array)和结构类型(struct),可以用向类型添加storage或者memory进行重写。函数参数 (包枯返回参数)默认用memory,本地变量默认用storage.显然,对于状态变量来说,位 置强制用storageo数据位置很重要,因为它们会改变分配的行为:storage变量和memory变量之间的分配总是创建一个独立的备份。但如果分配是从 memory存储的一种复杂类型到另一种复杂类型,则不创建备份。到一个状态变量的分配(即使是来自其他状态变量)总是创建一个独立的备份。不能把memory中国存储的复杂类型分配给本地存储变量。在分配状态变量和本地存储变量的情况下,本地存储变量指向状

3、态变量,也就是说,本 地存储变量变为指针。4什么是不同的数据类型Solidity是一种静态类型语言,变量存储的数据类型需要预先定义。所有变量默认都是0。在 Solidity中,变量是有函数作用范围的,在函数中任何地方声明的变量将对整个函数存在适 用范围,无论它是在哪里声明的。现在让我们看看Solidity提供的不同数据类型:最简单的数据类型是布尔值,可以是true或者false。uint8,uintl6,uint24,.uint256分别用于存储无符号的8位,16位,24位,246位整数。同理,int8,intl6 int256分别用于存储8位,16位,24位,.256位整数。uint和int

4、是uint256 和 int256 的别名。类似于 uint 和 int, ufixed 和 fixed 代码分数。ufixed0x8,ufixed0xl6 ufixed0x256分别用于存储未签名的8位,16位,24位,256位分数。同理,fixed Ox 8, fixed0xl6 fixed0x256分别用于存储8位,16位,24位,,256位分数。如果一个数字超过256位,则使用256位数据类型存储该数字的近似值。 address可以用于存储最大20字节的值(十六进制表示)。它用于存储以太坊地址。address类型有两个属性:balance和send。balance用于检测地址余额,se

5、nd用于向 地址发送以太币。send方法拿出需要转账的那些数量的wei,并根据转账是否成功返回 ture或者false。wei从调用send方法的合约中扣除。用户可以在Solidity中使用Ox前 缀给变量分配一个十六进制的数值。4.1数组类型Solidity支持generic和byte两种数组类型。它们支持固定长度和动态长度两种数组也支 持多维数组。bytesl, bytes2, bytes3 bytes32 是字节数组的类型。byte 是 bytesl 的别名。下面给出了 generic数组语法的一个示例:constract sample intQ myArray = 0,0;functi

6、on sample(uint index, int value)myArrayp ndex二 value;intQ myArray2 = myArray;uint243 memory myArray3 = 1,3,9999; uint82 myArray4 = 1,2;关于数组的重要内容如下:数组还有length属性,用于发现数组的长度用户还可以给length属性分配一个值, 以改变数组的大小,但不可以在内存中改变数组的大小,也不同可以改变非动态数组的 大小。如果想访问动态数组的微设置索引(unset index),会抛出异常。arrays structs和map都不可以作为函数参数,也不可以

7、用作函数返回值。4.2字符串类型在Solidity中,有两种方法创建字符串:使用bytes和stringo bytes用于创建原始字符串, 而string用于创建UTF-8字符串。字符串长度总是动态的。下面给出了字符串语法的一个 示例:string myString = bytes myRawString;function sample(string initString, bytes rawStringlnitX myStri ng = in itStri ng; string myString2 = myString;string memory myString3 二 “ABCDE:myS

8、tring3 二訣YZ:myRawString 二 rawStringlnit;myRawStringen gth+;string myString4 = Example; / throws exception while compiling string myString5 = initString; / throws exception while compiling4.3结构类型Solidity还支持结构类型(struct)o下面给出了 struct语法的一个示例: contract sample struct myStruct bool myBool;string myString;m

9、yStruct si;myStruct s2 = myStruct(true,M);function sample(bool initBool, string initString)si = myStruct(initBool, initString);myStruct memory s3 = myStruct(i nit Bool, initString);函数参数不可以是结构类型,且函数不可以返回结构类型。4.4枚举类型Solidity还支持枚举类型(enum) o下面给出了 enum语法的一个示例:enum OS Windows, Linux, OSX, UNIXOS choice;fu

10、nction sample(OS chosen)choice = chose n;function setUnuxOS0choice = OS. Li nux;function getChoiceO returns (OS chosenOSXreturn choice;4.5 mapping 类型mapping数据类型是一个哈希表omapping类型只可以存在与storage中,不存在与memory 中,因此它们是作为状态变量声明的。可以认为mapping类型包含key/value对,不是时间 存储key,而是存储key和keccak256哈希,用于查询value。mapping类型没有长度。

11、 mapping不可以被分配给另一个mappingo 下面给出一个创建和使用mapping的示例:contract sample mapping(int = string) myMap:function sample(int key: string value)myMap key = value;mapping(int=string) myMap2 = myMap;如果想访问mapping中不存在的key,返回的value均为0o4.6 delete操作符delete操作符可以用于任何变量,将其设置成默认值。默认值均为0.如果对动态数组使用delete操作符,则删除所有元素,其长度变为0。如果

12、对静态数组使用 delete操作符,则重置所有索引。还可以通过对特定索位置使用delete来重置索引。如果读map类型使用delete操作符,什么都不会发生。但是如果对map类型的一个键使用 delete操作符,则会删除与该键相关的值。下面给出了 delete操作符的一个示例:struct Struct mapping (int = int) myMap:int myNumber;intQ myArray;Struct myStruct;function sample(int key: int value, int number, int array)myStruct = Struct(num

13、ber);myStruct.myMapkey二 value;myArray = array;function resetOdelete myArray:delete myStruct;function deleteKey(int key)delete myStruct.myMapkey;4.7基本类型之间的转换除了数组类型、字符串类型、结构类型、枚举类型和map类型外,其他类型均称为基本类 型。如果把一个操作符应用与不同的类型,编译器将尝试把一个操作数隐式转换微另一种类型。 通常来说,如果没有语义信息丢失,值和类型之间可以进行隐式转换:uint8可转换微 uintl6,uintl28可转换微i

14、nt256,但int8不可转换微uint256(因为uint256不能存储,例如- l)o此外,无符号整数可以转换成同等大小或更大的字节,但是反之则不然。任何可以转换 成uintl60的类型都可以转换成地址。Solidity也支持显示转换所以如果编译器不允许在两种两种数据类型之间隐式转换,则可 以进行显示转换。建议尽量避免显式转换,因为可能返回难以预料的结果。来看一个例子:uint32 a = 0x12345678;uintl6 b 二 uintl6(a); /b will be 0x5678 now这里是将uint32类型显示转换微uintl6,也就是说,把较大类型转换为较小类型,因此高位

15、被砍掉了。4.8使用varSolidity提供了用于声明变量的va关键字。变量类型根据分配给它的第一个值来动态确定。 旦分配了值,类型剧固定了,所以如果给它知道另一类型,将引起类型转换。示例如下: int256 x = 12;var y = x;uint256 z = 9;y二乙在定义数组array和map时不能使用varo var也不能用于定义函数参数和状态变量。5控制结构solidity 支持 if/else/whiIe/for/break/continue/return ?:等控制结构。下面给出了控制结构的 个示例:int a = 12;into b;function sampleOif

16、(a = 12) esle if(a=34)elsevar temp = 10;while(temp20)if(temp 二二 17)break;contin ue;tempi;for(var iii = 0;iiibength; iii + +)6用new操作符创建合约个合约可以使用new关键字来创建一个新合约,但前提示必须知道新创建的合约的完整 代码。示例如下:con tract samplelint a;function assign(int b)a 二 b;con tract sample2function sample2()samplel s = new samplel();s.as

17、sign(12);7异常在一些情况下,异常会被自动抛出。也可以使用throw 动抛出异常。抛出异常会停止回滚 目前执行的调用(也就是说,撤销对状态和余额的所有改变)。捕获异常是不可能的: constract samplefunction myFunction。throw;在Solidity中,有两种函数调用:内部函数调用和外部函数调用。内部函数调用是指一个函 数在同一个合约中调用另一个函数。contract samplelfunction samplel(int b) payablefunction assign(int c)a 二c;function makePayment(int d) p

18、ayablea 二d;contract sample2samplel s = (new samplel).value(12)(23);s.makePayment(22);s.makePayment.value(45)(12);s.makePayment. value (4).gas(900)(12);this.helloO;samplel s2 = samplel(addressOfContract);s2.makePayment(112);使用this关键字进行的调用称为外部调用。在函数中,this关键字代表当前合约实例。9合约功能现在是时候深入学习合约了。我们将看看一些新的功能,还将深入学

19、习已经见过的一些功能。9.1可见性函数或者状态变量的可见性定义了谁可以看到它。函数和状态变量的四种可见性: external/public/intemal 和 private函数可见性默认为public,状态变量可见性默认为internalo各可见性函数的含义如下:externaL外部函数只能有其他合约调用,或者通过交易调用。外部函数f不能被内部 函数调用,也就是说,f()没有用,但this.fO有用。不能把external可见性应用到状态变量。publico公共函数和状态变量可以用所有可行办法访问。编译器生成的存取器(accessor) 函数都是公共状态变量。用户不能创建自己的存取器。事实上

20、,它只生成getters,而不 生成 setters ointernal内部函数和状态变量只可以内部访问,也就是说,从当前合约内核继承它的合 约访问。不可以使用this访问它。privateo私有函数和状态变量类似于内部函数,但是继承合约部可以访问它们。 下面给出了可见性和存取器(accessor)的一个示例:int public b = 78;int internal c = 90;function samplel()this.aQ;aQ: b = 21;this.b; this.b();this.b(8);this.cO:c = 9;function aO externalcontract

21、 sample2int internal d = 9; int private e = 90;con tract sample3 is sample2samplel s;function sample3()s = new samplelO;s.aO;var f = s.b;s.b 二 18;s.cO:d 二 8;e = 7;9.2函数修改器我们之前看到了函数修改器(functionmod帀e)的概念,还编写了一个基本的函数修改器, 现在来深入学习修改器。修改器由子合约(child contract)继承,且子合约可以对其重写。可以通过用空格分隔的列 表指定修改器将多个修改器应用到一个函数,并将

22、多个修改器按顺序估值;还可以像修改器 传送实参。在修改器中,无论下一个修改器或者函数体二者哪个先到达,会白插入到】”;出现的地方。 让我们来看一个函数修改器的复杂代码例子:con tract sampleint a = 90;modifier myModifierl(int b)int c =b;a 二8;modifier myModifier2 int c = a;modifier myModifier3 a = 96;return ;a=99;modifier myModifier4 int c = a;function myFunctionO myModifierl(a) myModif

23、ier2 myModifier3 return (int d)a = 1;return a;myFunctionO的执行代码如下:a = 96;return;int c = a;return a;a = 99;c =a;a 二 8;在上述代码中调用myFunctionO方法时,将返回0但是之后返回状态变量a时,将得到8. 修改器或者函数体中的retum(返回)立即离开整个函数,返回值被分配成它需要成为的任何 变量。就函数来说,return之后的代码在调用者的代码完成运行后再执行,就修改器来说,上述修 改器中的之后的代码在调用者的代码完成运行后在执行。在上面的例子中,第5、6和7行 从未执行过。

24、在第4行之后,执行从第8J0行开始。修改器中的etum不可以有相关值,它总是返回全0。9.3回退函数个合约可以有唯一的未命名函数,称为回退函数(fallbackfunction)o该函数不能有实参 不能返回任何值。如果其他函数都不能匹配给定的函数标识符,就在合约上执行回退函数。 当合约不用任何函数调用及接受以太币(即交易发生以太币给合约却不调用任何方法)时, 也执行该函数。在此情况下,用于函数调用的gas通常很少(准确地说是2300gas),所以使 回退函数尽可能便宜很重要。接收以太币但是却不定义回退函数的合约会抛出异常,把以太币发送回去,所以如果你想让 你的合约接收以太币,就必须要实现回退函

25、数。下面给出了回退函数的一个示例:construct samplefunctionQ payable/keep a note of how much Ether has been sent by whom9.4继承Slidity通过代码备份(包括多态)支持多重继承(multiple inheritance)。即使一个合约继承 自其它多个合约,在区块链上值创建一个合约,来自父合约(parentcontract)的代码总是 被复制到最终合约里。function aOOfunction b()contract sample2 is samplelcontract sample3function sa

26、mple3(int b)contract sample4 is samplel, sample2function c()aO;samplel.a();bO;contract sample5 is sample3(122)1. super关键字supe关键字用于引用最终继承链中的下一个合约,示例如下:constract samplelconstract sample2constract sample3 is sample2constract sample4 is sample2contract sample5 is sample4function myFuncQcontract sample6 is samplel, sample2, sample3,sample5function myFuncOsuper.myFuncO;其中,引用 sample6 合约的最终继承链式 sample6,sample5,sample4,sample2,sannple3 和 samplelo继承链始于衍生最充分的合约,终于衍生最不充分的合约。2.抽象合约仅

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1