区块链技术(三):智能合约入门

文章摘要图:

一个简单的智能合约

先从一个非常基础的例子开始

contract ZhaoxiStorage {

uint storedData;

function set(uint x) {

storedData = x;

}

function get() constant returns (uint retVal) {

return storedData;

}

}

在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个地址。

uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为无符号整数uint。可以看做数据库里面的一条记录,可以通过调用函数查询和修改它。在以太坊中,通常只有合约的拥有者才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。

跟很多其他语言一样,访问状态变量时,不需要在前面增加 this. 这样的前缀。

任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如何增加存取限制。

一个加密货币例子

接下来的合约将实现一个形式最简单的加密货币。通过这份代码,任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。

contract ZhaoxiCoin {

// 关键字“public”使变量能从合约外部访问。

address public minter;

mapping (address => uint) public balances;

// 事件让轻客户端能高效的对变化做出反应。

event Sent(address from, address to, uint amount);

// 这个构造函数的代码仅仅只在合约创建的时候被运行。

function ZhaoxiCoin() {

minter = msg.sender;

}

// 合约创建者可以调用mint

function mint(address receiver, uint amount) {

if (msg.sender != minter) return;

balances[receiver] += amount;

}

// send可以被拥有代币的任何人调用

function send(address receiver, uint amount) {

if (balances[msg.sender]

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; }

下一行代码mapping (address => uint) public balances; 创建了一个public的状态变量,但是其类型更加的复杂。该类型将一些address映射到无符号整数。mapping可以被认为是一个哈希表,每一个可能的key对应的value被虚拟的初始化为全0。对于一个mapping,无法获取一个包含其所有key或者value的链表。所以我们得自己记着添加了哪些东西到mapping中。在这个例子中由public关键字生成的访问函数将会更加复杂,其代码大致如下:

function balances(address _account) returns (uint balance) {

return balances[_account];

}

event Sent(address from, address to, uint value)这行代码声明了一个“事件”。由send函数的最后一行代码触发。客户端可以监听这些由区块链触发的事件。事件触发时,监听者会同时接收到from,to,value这些参数值,可以方便的用于跟踪交易。为了监听这个事件,你可以使用如下代码:

ZhaoxiCoin.Sent().watch({}, '', function(error, result) {

if (!error) {

console.log("Balances now:\n" +

}

}

这里有个比较特殊的函数 ZhaoxiCoin。它是一个构造函数,会在合约创建的时候运行,之后就无法被调用。它会永久得存储合约创建者的地址。msg(以及tx和block)是一个全局变量,它包含了一些可以被合约代码访问的属于区块链的属性。msg.sender 总是存放着当前函数的外部调用者的地址。

最后,真正被用户或者其他合约调用,用来完成本合约功能的函数是mint和send。如果合约创建者之外的其他人调用mint,什么都不会发生。而send可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。

以上就是一个简单的加密货币的完整代码和说明。

*提示:代码格式显示有问题的话,请访问原文:http://wangxiaoming.com/blog/2016/05/03/blockchain-tech-introduciton-to-smart-contracts/

本文来自企鹅号 - FinTech前哨媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏QQ会员技术团队的专栏

玩转webpack(二):webpack的核心对象

作者介绍:陈柏信,腾讯前端开发,目前主要负责手Q游戏中心业务开发,以及项目相关的技术升级、架构优化等工作。 前言 webpack 是一个强大的模块打包工具,之所...

1.3K8
来自专栏腾讯云Elasticsearch Service

Elasitcsearch 底层系列 Lucene 内核解析之 Stored Fields

Lucene 的 stored fields 主要用于行存文档需要保存的字段内容,每个文档的所有 stored fields 保存在一起,在查询请求需要返回字段...

1921
来自专栏菩提树下的杨过

ZooKeeper 笔记(6) 分布式锁

  目前分布式锁,比较成熟、主流的方案有基于redis及基于zookeeper的二种方案。   大体来讲,基于redis的分布式锁核心指令为SETNX,即如果目...

2468
来自专栏信安之路

pydictor 爆破字典生成指南

pydictor 是一个使用 python 语言开发,遵循 GPLv3 协议的开源命令行工具,主要用来帮助安全研究人员生成称心如意的暴力破解字典。

2860
来自专栏FreeBuf

VMware更新 | 修复Apache Flex BlazeDS中的漏洞

VMware发布了数个产品的版本更新,目的是修复Apache Flex BlazeDS中的一个漏洞。 据VMware介绍,Flex BlazeDS组件应用在数个...

2235
来自专栏圆方圆学院精选

​【刘文彬】 EOS行为核心:解析插件chain_plugin

原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/chainPlugin.html

1602
来自专栏专业duilib使用+业余界面开发

CreateProcess 创建带命令行参数的进程时,报错或者提示内存位置无效的可能的一个原因

2565
来自专栏Elasticsearch实验室

Elasitcsearch 底层系列 Lucene 内核解析之 Stored Fields

Lucene 的 stored fields 主要用于行存文档需要保存的字段内容,每个文档的所有 stored fields 保存在一起,在查询请求需要返回字段...

6965
来自专栏PingCAP的专栏

TiDB 源码阅读系列文章(十)Chunk 和执行框架简介

Chunk 本质上是 Column 的集合,它负责连续的在内存中存储同一列的数据,接下来我们看看 Column 的实现。

5.7K145
来自专栏Danny的专栏

System.Data.SqlClient.SqlException: 将截断字符串或二进制数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

3974

扫码关注云+社区

领取腾讯云代金券