伙伴们,我们今天分享的内容是关于如何写以太坊智能合约的知识。
在solidity中写的智能合约类似面向对象编程语言中的类。每个合约中包含注释注解、路径、语法、状态变量、函数、函数修饰器、事件、结构类型和枚举类型,合约可以继承。
前几天分享了几个简单智能合约,大家有了初步印象,今天就说说里面的一些知识点。
智能合约开始的第一行,都是告知编译器如何编译和标注版本号。
格式范例:pragmasolidity^0.4.0;
其中0.4.0是标注编程所用solidity的版本号,用哪个版本,写那个版本号。
pragma是pragmaticinformation的简称,solidity沿用c、c++编程语言中的编译指令概念,用于告知编译器如何编译。
为了方便维护等作用,编程代码需要注释,注释一行能写完的,用符号://
多行的注释用
/*
注
释
内
容 */显示;
状态变量,是永久的存储在合约存储器中的值。
Uint,无符号256位整数,其中,int,是有符号整数。uint=un+int,无符号整数,符号就是正负的意思,表示是个正的,没有负数,就是转移以太坊给别人,智能转0到很多个比特币,却不能转-5个比特币。
uint,是用来说明定义的数值是无符号256位整数。
uint8,是说明定义的数值是无符号8位整数。同样,uint16,uint32啥的等,都是说明数值范围。
bool,这也是常见的类型,就是返回true或者false。比如收到代币、投票成功等,就返回true。如果失败,就返回false。
!是否定。
&& 是和同时的意思。
|| 是或者。
== 等于。
!=不等于。
address,是常用的,代表以太币地址的数值。需要接受、返回、记录以太币地址时,就要用这个来定义。
函数,是智能合约里可执行的一组代码。 形式是:function ----- {------}。
事件:合约中常见的,是与以太坊虚拟机日志工具的方便借口,用于将各种数据传输到日志上,方便查阅。用Event来声明。形式是:event --------(---);
比如:钱包收到代币、代币转走、投票成功等等,都可以通过事件,自动统计通知到日志里,方便你想知道的事件的通知。
结构类型: 将几个变量分组的自定义类型。用struct定义。 比如要定义投票人的年龄钱包地址 是否投票:
struct voter {
uint old
bool voted
address delegate
}
导入语句:import,用来导入各种编程语句。
import “别的智能合约名字”;就可以导入别的智能合约所有的全局符号。
import *
assymbolname friom "别的智能合约的名字";
import
"别的智能合约的名字"assymbolname;
这两句代码意思一样,都是全部复制"别的智能合约的名字" 中的全局符号来创建一个新的全局符号 symbolname。
编写智能合约时,要注意路径。一个实心小圆点 . 代表当前目录,两个实心小圆点 .. 代表上一层的更大的父目录。
/是目录分隔符。 ./ 当前目录。 ../父目录。
import “./x” asx;这个是导入当前源文件同目录下的文件x。
import “../x”as x;这个是导入当前文件父目录下的文件x。
这些就是常见基本的智能合约知识。 区块链本身很复杂,但是以太坊等为了大家更方便的使用区块链,编写了solity编程语言,方便大家编写。
简单说,无论什么功能目的的智能合约,都是为了在链上保存数据、修改数据等。
买卖代币,就是改变数据的代币数据。
如果有两个以上卖单都要卖掉同一账户的代币,这就是著名的“双花攻击”。
发生双花时咋办? 比如账户拥有者,丢失了秘钥匙,黑客和拥有者同时都想转走所有代币,谁会成功?
以太坊的解决,就是为这两笔交易 自动选择交易序列,并打包到区块中,然后在所有参与节点中执行和分发,先发生的交易会被确认记录在区块中,后发生的会被拒绝,不会记录在区块中。
这就做到了一笔钱,只会一个人转走成功,不会两边都转走成功。
以太坊的所有指令都是围绕uint类型的数值,就是256整数的数值,进行操作。常见的操作就是算数、位、逻辑、比较,还有有条件和无条件跳转。可以访问当前区块的相关属性,比如编号和时间戳。
日志:为了大家及时直观的了解数据变动, 就用events 事件把想要看到的数据的变动, 及时发布到日志上。日志是一个特殊的可索引的数据结构,日志的数据可以直接反应区块上的数据。日志可以区块链外高效安全访问,而不用接触到区块链, 安全又方便的实现了大家都可以查看区块链上的数据。
所以智能合约的编程都是围绕着区块链上的数值进行, 目标单纯,编程就容易多了, 更主要用智能合约把区块链的威力发挥出来。
未完待续。
网友评论