pragma solidity ^0.4.16;

contract OwnedToken {
// TokenCreator是个合约类型,由后面部分定义。只要不用于创建新合约,引用它就好
TokenCreator creator;
address owner;
bytes32 name; // 构造函数,用于指定创建者和名字
function OwnedToken(bytes32 _name) public {
owner = msg.sender;
creator = TokenCreator(msg.sender);
name = _name;
} // 变更名字,仅创建者有权修改
function changeName(bytes32 newName) public {
if (msg.sender == address(creator))
name = newName;
} // 转帐,仅属主人有权转帐
function transfer(address newOwner) public {
if (msg.sender != owner) return; // 检查转帐是否成功,如果返回失败(比如,gas用尽),立即停止
if (creator.isTokenTransferOK(owner, newOwner))
owner = newOwner;
}
} contract TokenCreator {
function createToken(bytes32 name) public returns (OwnedToken tokenAddress) {
// 建立新token合约,返回地址
return new OwnedToken(name);
} function changeName(OwnedToken tokenAddress, bytes32 name) public {
tokenAddress.changeName(name);
} function isTokenTransferOK(address currentOwner, address newOwner) public view returns (bool ok) {
address tokenAddress = msg.sender;
return (keccak256(newOwner) & 0xff) == (bytes20(tokenAddress) & 0xff);
}
}

可见性和访问限制符

函数可以被定义为external, public, internal or private,缺省是 public。对状态变量而言, external是不可能的,默认是 internal。

# external
外部函数是合约接口的一部分,这意味着它们可以从其他合约调用, 也可以通过事务调用。外部函数f不能被内部调用(即 f()不执行,但this.f()执行)。外部函数,当他们接收大数组时,更有效。 # public
公共函数是合约接口的一部分,可以通过内部调用或通过消息调用。对公共状态变量而言,会有的自动访问限制符的函数生成 internal
这些函数和状态变量只能内部访问(即在当前合约或由它派生的合约),而不使用(关键字)this 。 private
私有函数和状态变量仅仅在定义该合约中可见, 在派生的合约中不可见。
pragma solidity ^0.4.0;

contract C {
uint private data; // data是私有变量 function f(uint a) private returns(uint b) { return a + 1; } // f是私有函数
function setData(uint a) public { data = a; }
function getData() public returns(uint) { return data; }
function compute(uint a, uint b) internal returns (uint) { return a+b; } // compute是内部函数
} contract D {
function readData() public {
C c = new C(); // 合约类型C实例化,生成对象c
uint local = c.f(7); // 由于f是私有函数,实例c不能调用f函数
c.setData(3);
local = c.getData();
local = c.compute(3, 5); // 由于compute是内部函数,实例c不能调用compute函数
}
} contract E is C {
function g() public {
C c = new C();
uint val = compute(3, 5); // E是C的子合约,可直播使用compute内部函数
}
}
pragma solidity ^0.4.0;

contract C {
uint public data = 42; // data是全局变量
} contract Caller {
C c = new C();
function f() public {
uint local = c.data(); // 实例c允许调用data
}
}
pragma solidity ^0.4.0;
contract C {
uint public data; function x() public {
data = 3; // 没有this关键字,内部访问方式,以变量形式进行访问
uint val = this.data(); // 使用关键字this,外部方式访问,做为函数访问,this代表当前合约
}

复杂一些的示例

pragma solidity ^0.4.0;

contract Complex {
struct Data {
uint a;
bytes3 b;
mapping (uint => uint) map;
} mapping (uint => mapping(bool => Data[])) public data;
} function data(uint arg1, bool arg2, uint arg3) public returns (uint a, bytes3 b) {
a = data[arg1][arg2][arg3].a;
b = data[arg1][arg2][arg3].b;
} Data
{ 'a': 1, 'b': x, 'map': { 1: 1}} data
{ 1: 'true': [ Data]}

solidity语言10的更多相关文章

  1. Solidity语言系列教程

    Solidity 是一门面向合约的.为实现智能合约而创建的高级编程语言.这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在 以太坊虚拟机(EVM) 上运行. ...

  2. 用solidity语言开发代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  3. 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约

    智能合约是以太坊的核心之一,用户可以利用智能合约实现更灵活的代币以及其他DApp.不过在深入讲解如何开发智能合约之前,需要先介绍一下以太坊中用于开发智能合约的Solidity语言,以及相关的开发和测试 ...

  4. solidity语言介绍以及开发环境准备

    solidity语言介绍以及开发环境准备   Solidity 是一门面向合约的.为实现智能合约而创建的高级编程语言.这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的 ...

  5. 用C++生成solidity语言描述的buchi自动机的初级经验

    我的项目rvtool(https://github.com/Zeraka/rvtool)中增加了生成solidity语言格式的监控器的模块. solidity特殊之处在于,它是运行在以太坊虚拟机环境中 ...

  6. Solidity语言基础 和 Etherum ERC20合约基础

    1. 类型只能从第一次赋值中推断出来,因此以下代码中的循环是无限的,  小. for (var i = 0; i < 2000; i++) { ... } --- Solidity Types ...

  7. solidity语言

    IDE:Atom 插件:autocomplete-solidity 代码自动补齐   linter-solium,linter-solidity代码检查错误   language-ethereum支持 ...

  8. solidity语言13

    函数过载 合约内允许定义同名函数,但是输入参数不一致 pragma solidity ^0.4.17; contract A { function f(uint _in) public pure re ...

  9. solidity语言8

    输入参数 pragma solidity ^0.4.16; contract Simple { function taker(uint _a, uint _b) public pure { // do ...

随机推荐

  1. Apache 去掉 www

    1 用phpstudy的网友打开“其他选项菜单”- “配置文件”-httpd-conf.找到 #LoadModule rewrite_module modules/mod_rewrite.so 把这一 ...

  2. 洛谷 P1155 【NOIP2008】双栈排序

    题目链接 题解 这题有点神啊.. 我们仔细观察一下,发现两个栈内元素必须为降序 那么有结论 如果有\(i < j < k\) 且 \(a[k] < a[i] < a[j]\)则 ...

  3. .Net支持Redis哨兵模式

    csredis 博客 csRedisgit地址 csRedis3.2.1 Nuget地址 (在使用csredis3.2.1获取sentinel时产生运行时异常,调查问题最后发现是获取sentinel的 ...

  4. Oracle sql 中的 ALL,ANY,SOME

    [转自] http://www.itpub.net/thread-1355835-1-1.html any和some是等价的,其与all的前面都只能是比较符号,即=, !=, >, <, ...

  5. centos 7 查看系统版本信息

    2018-11-06 1. 查看版本号  CentOS的版本号信息一般存放在配置文件当中,在CentOS中,与其版本相关的配置文件中都有centos关键字,该文件一般存放在/etc/目录下,所以说我们 ...

  6. Shiro登录的故事

    从前,有一个subject,他有一个UsernamePasswordToken的实例,也就是token: 他准备登录,于是调用subject.login(AuthenticationToken tok ...

  7. Maven系统学习

    1. 1.1 何为构建? 编译.测试.运行.打包.部署等工作: Maven就是用软件的办法让这一系列工作自动化,只需要一条简单的命令,所有繁琐的工作就会自动完成: Maven最大的消除了构建的重复,抽 ...

  8. TOJ 4119 Split Equally

    描述 Two companies cooperatively develop a project, but they don’t like working with one another. In o ...

  9. elasticsearch清空type下的所有数据

    DELETE /twitter/tweet/_query{"query": { "match_all": {} }} 注:twitter为index,tweet ...

  10. 如何优雅地使用httprunner进行接口测试

    一天,你的领导X要你对某接口做测试,你一听,接口测试,高大上.用什么做好呢?postman?jmeter?loadrunner?balabala...优秀的你,想到了一大堆工具,当然也包括用pytho ...