区块链相关技术学习——solidity官方文档学习Coin

contract SimpleStorage {
uint storedData; //定义了一个uint类型的变量storedData

function set(uint x) {
    storedData = x;
}//设置storedData的值

function get() constant returns (uint retVal) {
    return storedData;
}//返回storeData的值

}
这个合约还无法做很多事情(受限于以太坊的基础设施),仅仅是允许任何人储存一个数字。而且世界上任何一个人都可以来存取这个数字,缺少一个(可靠的)方式来保护你发布的数字。任何人都可以调用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;public表示其他的外部合约可以访问有public的变量,同时定义了一个address类型的变量 minter。自动生成的函数如下:
function minter() returns (address) { return minter; }
mapping (address =>uint) public balances;创建一个public类型的状态变量,但是该类型更加的复杂。该类型将一些address映射到无符号整数。mapping可以被认为是一个哈希表,每一个可能的key对象的value被虚拟的初始化为0。生成的函数如下:
function balances(address _account) returns (uint balance) {
return balances[_account];
}
我们可以通过这个函数查询的地址为address的账户余额。

    event Send(address from,address to,uint value)声明了一个事件,由send函数的最后一行代码触发。客户端(服务器端)可以以很低的开销的来监听区块链触发的事件。事件触发了,监听者会同时接收到 from,to,value这些参数值,方便于跟踪交易。为了监听这个事件,你可以使用如下代码
    Coin.Sent().watch({}, '', function(error, result) {
if (!error) {
    console.log("Coin transfer: " + result.args.amount +
        " coins were sent from " + result.args.from +
        " to " + result.args.to + ".");
    console.log("Balances now:\n" +
        "Sender: " + Coin.balances.call(result.args.from) +
        "Receiver: " + Coin.balances.call(result.args.to));
}

}

    这里有个比较特殊的函数的Coin,是一个构造函数,在合约创建的时候运行,之后就再也无法被调用。它会永久的得到存储合约创建者的地址,msg是一个奇妙的全局变量,msg.sender总是存放着当前函数的外部调用者的地址。
    最后,真正被用户或者其他合约调用,用来完成本合约功能的函数是mint和send。如果合约创建者之外的其他人调用mint,什么都不会发生。而send可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。注意,当你通过该合约发送一些代币到某个地址,在区块链浏览器中查询该地址将什么也看不到。因为发送代币导致的余额变化只存储在该代币合约的数据存储中。通过事件我们可以很容易创建一个可以追踪你的新币交易和余额的“区块链浏览器”。





        对于程序员来说,区块链这个概念其实并不难理解。因为最难懂的一些东西(挖矿,哈希,椭圆曲线加密,点对点网络等等)只是为了提供一系列的特性和保障。只需要接受这些既有的特性,不需要关心其底层的技术。

猜你喜欢

转载自blog.csdn.net/qq_36344771/article/details/81100502