VitalikButerin >在2007到2010年,我痴迷于玩“魔兽世界”这款游戏,但是突然有一天,暴雪移除了我心爱术士的虹吸生命术技能所具有的的伤害。我哭着到睡着了。从那一天起,我意识到了中心化服务器带来的可怕后果。我很快决定退出这一切... ——VitalikButerin以太坊创始人 在上一篇文章中,我们介绍了区块链由于其代码的可验证性,对于×××游戏带来了新的生机。但是区块链给游戏带来的冲击还远远不止于此。比如说? 永远不会被关闭 当我们在玩一款游戏的时候,我们常常会担心这款游戏在几年以后突然就关闭了,自己为游戏中的所有物品、为这款游戏倾注的心血都会随此全部消失。我...
合约结构 1、明确solidity的版本号。此行意味着我们正在阻止我们的程序被一个比0.4.0更老的编译器编译^表示向上兼容,但是不能够被0.5.0及其以上的编译器编译。我们这样做是为了尽量减少代码以意想不到或不兼容的方式编译时可能发生的错误的风险。 2、定义一个合约,内部有不同的方法和属性。 描述一个对象,可以从属性和行为两个方面,这正是面向对象的重要特征。3、在合约的内部声明变量的方法和属性。4、定义不同的函数、属于不同的函数成员。 代码结构 函数的一般形式 1 function(<parametertypes>){public|internal|ex...
pure与view代码例子 如下的一段solidity智能合约中,只要有了pure与view修饰符的函数,那么调用函数就不会消耗gas。而没有pure与view修饰的函数,如下面的change就会消耗gas。 12345678910111213141516171819 pragmasolidity^0.4.23;contractHelloWorld{ stringpublicname="jonson"; functiongetName()publicviewreturns(string){ re...
在之前,我们已经写好了一个最简单的helloworld合约,如下: 1234567891011121314151617 pragmasolidity^0.4.23;contractHelloWorld{ stringpublicname="jonson"; functiongetName()publicviewreturns(string){ returnname; } functionchangeName(string_name)public{&nb...
变量 存储数据的抽象单位,代表内存中的一段空间。 类型 同其他的编程语言一样,solidity中也有许多基本的类型。类型决定了存储空间的大小和解析的方式。下面列举出了solidity中基本的类型int、uint、byte、string、bool 基本类型 bool类型 这一小节中介绍基本的bool类型,bool类型只能够存储true或者false。 bool运算与运算符 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 pragmasolidity^0....
整型变量 整数是现实中处理最多的单位,在solidity中的整数类型有int和uint,int类型可以存储负数,uint类型只能够存储非负数。int类型:int8,int16,int24,int32…int256uint类型:uint8,uint16,uint24,uint32…uint256 后面的数字代表的是计算机的最小存储单位:位。1个字节代表8位。类型以一个字节递增,最大到256位,也就是32个字节。intint256uintuint256 整型运算 1、加2、减3、乘4、除5、取余数6、平方 123456789101112131415161718192021222324 /...
位运算 solidity中,可以对于最底层的位进行操作。由于以太坊中需要消耗gas,因此,为了节约gas、所以对于位的操作会用到比较频繁。solidity中支持多种类型的位运算操作1、位与&2、位或|3、位异或^4、位取反5、<<6、>> 数字3、4的二进制表示 数字3、4的底层表示 位与 位与 位或 位或 位异或 位异或 位取反 位取反 位左移 位左移 位右移 位右移 位运算例子 123456789101112131415161718192021222324252627282930313233 pragmas...
位运算 solidity中,可以对于最底层的位进行操作。由于以太坊中需要消耗gas,因此,为了节约gas、所以对于位的操作会用到比较频繁。solidity中支持多种类型的位运算操作1、位与&2、位或|3、位异或^4、位取反5、<<6、>> 数字3、4的二进制表示 数字3、4的底层表示 位与 位与 位或 位或 位异或 位异或 位取反 位取反 位左移 位左移 位右移 位右移 位运算例子 123456789101112131415161718192021222324252627282930313233 pragmas...
byte类型 有bytebytes1bytes2…bytes32特殊的有bytebytes1 后面的数字代表占了多少字节。1个字节在内存中占了8位 性质 固定字节数组不能修改长度和内容 字节一般用16进制来存储 16进制中的1个数字代表占了4位。 1234567 bytes1publicnum1=0x6a; //转换为10进制:106bytes2publicnum2=0x6a6f; //转换为10进制:27247bytes6publicnum3=0x6a6f6e736f6e;bytes1publica=0x6a;//...
动态字节数组的定义 bytes变量名=newbytes(大小); 动态字节数组的属性 可以修改大小和长度 动态字节数组默认初始化为0 bytespublicname=newbytes(2);name的值一开始为0x0000 动态字节数组的赋值 1234 functionInitName() public{ name[0]=0x6a; name[1]=0x6f; } 动态字节数组的属性 123 functiongetLength()viewpublic returns(uint...
字符串 string类型存储字符串,在solidity中使用了UTF-8格式来存储字符串。 123 stringpublicname="jonson";//6a6f6e736f6estringpublicname1="!@$%^&())";stringpublicname2="我爱你"; 字符串不能直接的获取长度和内容 下面是错误的方式 1234567 //functiongetLength()returns(uint){// name.length;//}//functiongetName()returns(bytes1){// ...
固定字节数组相互转换 固定长度字节数组之间能够进行相互转换 1234567891011121314151617181920 pragmasolidity^0.4.23;contract fixTofix{ bytes6name= 0x6a6f6e736f6e; //bytes1:0x6a function Tobytes1()viewpublicreturns(bytes1){ returnbytes1(name); &n...
固定字节数组转动态字节数组 要将固定长度的字节数组转换为动态长度的字节数组,需要首先创建动态数组,并挨个赋值。 12345678910111213141516 pragmasolidity^0.4.23;contract fixTodynamic{ bytes6name= 0x6a6f6e736f6e; function Todynamic()viewpublicreturns(bytes){ //returnbytes(name); &nbs...
动态字节数组转换为string 动态字节数组可以通过string(name)非常直接的转换为string类型,下面为例子: 1234567891011121314 pragmasolidity^0.4.23;contractdynamicTostring{ bytesname=newbytes(2); functionInitName()public{ name[0]=0x6a; name[1]=0x6f; } &nb...
固定字节数组转string 固定字节数组转换为string没有好的办法,必须要首先将固定字节数组转换为动态字节数组,再将动态字节数组转换为string 123456789101112 //bytes2 -> bytes ---->string functionfixtostr(bytes32_newname)purepublicreturns(string){ bytesmemorynewName=newbytes(_newname.length); for(uinti=0;i<ne...
数组 内存中的一片连续区域 定义 12 int[7]math;bytes2[3]bytesTest; 赋值 1 uint[5]public grade=[1,2,3,4,5]; 修改内容 123 functioninit2()public{ bytesTest[1]=0x6a6f;} 返回数组 1234 functiongetArray2()publicviewreturns(bytes2[3]){returnbytesTest;} 获取数组长度 1234 functiongetlength()publicviewr...
动态长度数组 动态长度数组可以改变大小和长度 动态长度数组的定义 uint[]grade=[1,2,3,4,5]; 返回动态长度数组 123 functiongetArray()publicviewreturns(uint[]){ returngrade; } 获取动态数组长度 123 functiongetlength()publicviewreturns(uint){ returngrade.length;} 遍历动态长度数组 123456789 functioncheng()publicv...
二维数组定义 1 uint[2][3]grade=[[60,80],[40,20],[50,50]]; 返回二维数组 1234 functiongetGrade()viewpublicreturns(uint[2][3]){ returngrade;} 获取二维数组长度 123456789 functiongetLength()viewpublicreturns(uint){ returngrade.length;} functiongetLength2()viewpublicreturns(uint){&...
for for语句为"当型"循环结构。for语句的语法为: 123 for(表达式1;表达式2;表达式){ 语句} 说明:表达式1为循环变量赋初始值。表达式2为循环条件。表达式3为循环变量增值。 for循环打印斐波拉耶数列 123456789101112131415161718192021 pragmasolidity^0.4.23;contract forTest{ //0,1,1,2,3,5,8,13,21 uint[]publicarr=[1,1]; functiongetArr(...
动态二维数组定义 uint[][]publicgrade=[[60,80],[40,20],[50,50]]; 获取长度 123456789 functiongetLength()viewpublicreturns(uint){ returngrade.length;} functiongetLength2()viewpublicreturns(uint){ returngrade[0].length;} 修改长度 12345678910111213141516 functionchangeLength()public...