Solidity编写智能合约(入门)编写智能合约(入门)
一个简单的智能合约
存储
在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个特殊地址。
uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为 uint (256bits无符号整数)。你可以认为它就
像数据库里面的一个存储单元,跟管理数据库一样,可以通过调用函数查询和修改它。在以太坊中,通常只有合约 的拥有者
才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。
跟很多其他语言一样,访问状态变量时,不需要在前面增加 this. 这样的前缀。
这个合约还无法做很多事情(受限于以太坊的基础设施),仅仅是允许任何人储存一个数字。而且世界上任何一个人都可以来
存取这个数字,缺少一个(可靠 的)方式来保护你发布的数字。任何人都可以调用set方法设置一个不同的数字覆盖你发布的
数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如 何增加一个存取限制,使得只有你才能修改这个数字。
代币的例子
接下来的合约将实现一个形式最简单的加密货币。空中取币不再是一个魔术,当然只有创建合约的人才能做这件事情(想用其
他货币发行模式也很简单,只是实现细节上的差异)。而且任何人都可以发送货币给其他人,不需要注册用户名和密码,只要
有一对以太坊的公私钥即可。
注意
对于在线solidity环境来说,这不是一个好的例子。如果你使用在线solidity环境 来尝试这个例子。调用函数时,将无法改变
from的地址。所以你只能扮演铸币者的角色,可以铸造货币并发送给其他人,而无法扮演其他人的角色。这点在线 solidity环
境将来会做改进。
这个合约引入了一些新的概念,让我们一个一个来看一下。
address public minter 这行代码声明了一个可公开访问的状态变量,类型为address。address类型的值大小为160 bits,不支
持任何算术操作。适用于存储合约的地址或其他人的公私钥。public关键字会自动为其修饰的状态变量生成访问函数。没有
public关键 字的变量将无法被其他合约访问。另外只有本合约内的代码才能写入。自动生成的函数如下:
当然我们自己增加一个这样的访问函数是行不通的。编译器会报错,指出这个函数与一个状态变量重名。
下一行代码mapping (address => uint) public balances; 创建了一个public的状态变量,但是其类型更加的复杂。该类型将一些
address映射到无符号整数。mapping可以被认为是一个哈希表,每一个可能的key对应的value被虚拟的初始化为全0.这个类
比不是很严谨,对于一个mapping,无法获取一个包含其所有key或者value 的链表。所以我们得自己记着添加了哪些东西到
mapping中。更好的方式是维护一个这样的链表,或者使用其他更高级的数据类型。或者只在不受这个缺陷影 响的场景中使
用mapping,就像这个例子。在这个例子中由public关键字生成的访问函数将会更加复杂,其代码大致如下:
我们可以很方便的通过这个函数查询某个特定账号的余额。
event Sent(address from, address to, uint value)这行代码声明了一 个“事件”。由send函数的最后一行代码触发。客户端(服
务端应用也适用)可以以很低的开销来监听这些由区块链触发的事件。事件触发时,监听者会同时接 收到from,to,value这
些参数值,可以方便的用于跟踪交易。为了监听这个事件,你可以使用如下代码:
注意在客户端中是如何调用自动生成的 balances 函数的。
这里有个比较特殊的函数 Coin。它是一个构造函数,会在合约创建的时候运行,之后就无法被调用。它会永久得存储合约创
建者的地址。msg(以及tx和block)是一个神奇的 全局变量,它包含了一些可以被合约代码访问的属于区块链的属性。
msg.sender 总是存放着当前函数的外部调用者的地址。
最后,真正被用户或者其他合约调用,用来完成本合约功能的函数是mint和send。如果合约创建者之外的其他人调用mint,什
么都不会发生。而 send可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。注意,当你通过该合约发送一些
代币到某个地址,在区块链浏览器中查询该地址将什么 也看不到。因为发送代币导致的余额变化只存储在该代币合约的数据
存储中。通过事件我们可以很容易创建一个可以追踪你的新币交易和余额的“区块链浏览器”。
区块链基础
对于程序员来说,区块链这个概念其实不难理解。因为最难懂的一些东西(挖矿,哈希,椭圆曲线加密,点对点网络等等)只
是为了提供一系列的特性和保 障。你只需要接受这些既有的特性,不需要关心其底层的技术。就像你如果仅仅是为了使用亚
马逊的AWS,并不需要了解其内部工作原理。
交易/事务
评论5