智能合约的基本原理是把传统合同的条款编制成【18I链上合约-259l开发系统3365】一套计算机代码,在买卖各方签署后自动运行。区块链上的智能合约是把前述计算机代码部署到公链上,使其在公链上自动运行。智能合约的签署和执行过程中的每一步都形成一个区块,并根据分布式记账原理被记录于链上每个节点
在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个特殊地址。uint storedData;这行代码声明了一个状态变量,变量名为storedData,类型为uint(256bits无符号整数)。你可以认为它就像数据库里面的一个存储单元,跟管理数据库一样,可以通过调用函数查询和修改它。在以太坊中,通常只有合约的拥有者才能这样做。在这个例子中,函数set和get分别用于修改和查询变量的值。
跟很多其他语言一样,访问状态变量时,不需要在前面增加this.这样的前缀。
这个合约还无法做很多事情(受限于以太坊的基础设施),仅仅是允许任何人储存一个数字。而且世界上任何一个人都可以来存取这个数字,缺少一个(可靠的)方式来保护你发布的数字。任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如何增加一个存取限制,使得只有你才能修改这个数字。
contract Coin { //关键字“public”使变量能从合约外部访问。 address public minter; mapping (address => uint) public balances;
//事件让轻客户端能高效的对变化做出反应。 event Sent(address from, address to, uint amount);
//这个构造函数的代码仅仅只在合约创建的时候被运行。 function Coin() { minter = msg.sender; } function mint(address receiver, uint amount) { if (msg.sender != minter) return; balances[receiver] += amount; } function send(address receiver, uint amount) { if (balances[msg.sender] < amount) return; balances[msg.sender] -= amount; balances[receiver] += amount; Sent(msg.sender, receiver, amount); } } 这个合约引入了一些新的概念,让我们一个一个来看一下。 address public minter; 这行代码声明了一个可公开访问的状态变量,类型为address。address类型的值大小为160 bits,不支持任何算术操作。适用于存储合约的地址或其他人的公私钥。public关键字会自动为其修饰的状态变量生成访问函数。没有public关键字的变量将无法被其他合约访问。另外只有本合约内的代码才能写入。自动生成的函数如下: function minter() returns (address) { return minter; } 当然我们自己增加一个这样的访问函数是行不通的。编译器会报错,指出这个函数与一个状态变量重名。