solidity合约详解
Solidity 是一个面向合约的高级语言,其语法类似于JavaScript 。是运行在以太坊虚拟机中的代码。这里我们用的是remix编译环境。是一个在线的编译环境。地址为http://remix.ethereum.org
Solidity的合约类似于面向对象语言中的类。下面我们可以先创建一个合约。
pragma solidity ^0.4.7;
contract a{
uint x;
function set(uint num) public{
x = num;
}
function get() public returns(uint){
return x;
}
}
这里我们创建了一个合约a,合约中有一个状态变量 x,状态变量的储存方式是storage的,定义了两个函数 set 和 get,通过这两个函数就可以得到和修改x。同时也可以申明构造函数。
pragma solidity ^0.4.7;
contract a{
uint x;
function a() public{
x = 2;
}
function set(uint num) public{
x = num;
}
function get() public returns(uint){
return x;
}
}
构造函数的名字要和合约的名字相同,上面的构造函数中对 x 初始化为1。
pragma solidity ^0.4.7;
contract b{
uint public y;
}
contract a{
uint x;
b B = new b();
function a() public{
x = 1;
}
function set(uint num) public{
x = num;
}
function get() public returns(uint){
return x;
}
}
上面的合约中我们在合约a中创建了合约b的对象 B,就可以通过B来调用 b 中的变量和函数。
在合约中的函数可以被指定为外部的,公共的,内部的或私有的,默认是公共的。 对于状态变量,外部是不可能的,默认是内部的。
external:
外部功能是合约接口的一部分,这意味着它们可以通过其他合约和交易进行调用。 外部函数f不能在内部调用(即f()不起作用,但this.f()可以正常工作
public:
公共功能是合同接口的一部分,可以在内部或通过消息进行调用。 对于公共状态变量,生成自动Getters函数。
internal:
这些功能和状态变量只能在内部进行访问(即从当前合约或从其中获得的合约),而不使用这些变量。
private:
私有函数和状态变量只对其中定义的合约而不是衍生合约可见。
pragma solidity ^0.4.7;
contract b{
uint public y;
function set(uint num) public{
y = num;
}
function get() internal returns(uint){
return y;
}
}
contract a{
uint x;
b B = new b();
function a() public{
x = 1;
}
function set(uint num) public{
B.set(2);
x = num;
}
function get() public returns(uint){
return x;
}
function gety() public returns(uint){
return B.get();//错误,在合约b中的函数
return B.y();
} }
编译器会自动为所有公共状态变量创建getter函数。因此编译器将生成一个名为y的函数,它不接受任何参数,并返回一个uint,即状态变量数据的值。
solidity也支持合约的继承,由于继承实现是代码复制。如果出现函数名重写,最终使用的是继承链上哪个合约定义的代码呢?实际执行时,依据的是最远继承的原则
pragma solidity ^0.4.7;
contract b{
function data() public returns(uint){
return 1;
}
}
contract a{
function data() public returns(uint){
return 2;
}
}
contract c is a,b{
function call() public view returns(uint){
return data();
}
}
contract d is b,a{
function call() public view returns(uint){
return data();
}
}
上面的代码中根据最远继承原则,合约 c 中 call 函数调用的是合约 b 的data 函数,合约 d 调用的是合约 a 的 data 函数
solidity合约详解的更多相关文章
- solidity事件详解
很多同学对Solidity 中的Event有疑问,这篇文章就来详细的看看Solidity 中Event到底有什么用? 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊. ...
- 详解 Solidity 事件Event - 完全搞懂事件的使用
很多同学对Solidity 中的Event有疑问,这篇文章就来详细的看看Solidity 中Event到底有什么用? 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊. ...
- truffle使用详解
truffle使用详解 truffle是什么 Truffle测试环境 安装truffle truffle项目结构解析 文件编译 truffle的配置文件 移植 与合约进行交互 1.truffle是什么 ...
- 以太坊客户端Geth命令用法-参数详解
Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...
- Hyperledger Fabric架构详解
区块链开源实现HYPERLEDGER FABRIC架构详解 区块链开源实现HYPERLEDGER FABRIC架构详解 2018年5月26日 陶辉 Comments 10 Comments hyper ...
- 详解服务器性能测试的全生命周期?——从测试、结果分析到优化策略(转载)
服务器性能测试是一项非常重要而且必要的工作,本文是作者Micheal在对服务器进行性能测试的过程中不断摸索出来的一些实用策略,通过定位问题,分析原因以及解决问题,实现对服务器进行更有针对性的优化,提升 ...
- 1-Hyperledger Fabric概念详解
目录 一.Hyperledger Fabric概述 二.基本术语 1.共享账本ledger 2.通道Channel 3.组织Org 4.智能合约Chaincode 5.背书Endorse 6.各种节点 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
随机推荐
- Oracle中case的第二种用法
procedure P_GetProVerSingInfo_2018(varFileID in varchar2, p_cr1 out refcontent, p_cr2 out refcontent ...
- AtomicIntegerArray数组类型类
前一篇文章学习了AtomicXXX基本数据类型类,可以为int,boolean或者reference类型,也就是单个元素的原子类.那么数组类型呢? 下面以AtomicIntegerArray为例进 ...
- 浅谈React和VDom关系
组件化 组件的封装 组件的复用 组件的封装 视图 数据 视图和数据之间的变化逻辑 import React, {Component} from 'react'; export default clas ...
- 解决IDEA打印到控制台的中文内容乱码
File-->Settings-->Editor-->File Encodings->将图中内容均设置为UTF-8--->点击+号选中自己的项目->Apply--& ...
- Vue性能优化之组件按需加载(以及一些常见的性能优化方法)
关于Vue中的按需加载我就简单介绍一下:大概就是我们所有的东西都会在app.js里面,但是我们并不需要把所有的组件都一次性加载进来,我们可以在需要它的时候再将它加载进来,话不多说,开车! 1.webp ...
- 《MySQL必知必会》--使用cmd登陆数据库
数据库:保存有组织的数据的容器(通常是一个文件或一组文件). 表:某种特定类型数据的结构化清单. 模式:关于数据库和表的布局及特性的信息. 列:表中的一个字段.所有表都是由一个或多个列组成的. 数据类 ...
- collections.namedtuple()命名序列元素
## collections.namedtuple()命名序列元素 from collections import namedtuple Student = namedtuple("Stud ...
- Docker之centos 简单安装
centos6因为系统自带的可执行的应用程序与 docker 包名字发生冲突,所以重新命名 docker 的RPM包名字为 docker-io. 首先卸载docker包 sudo yum -y rem ...
- 『Python基础-13』函数 Function
这篇笔记记录的知识点: 函数的基本概念 自定义函数 函数的几种参数 编程的三种方式: 1.OOP 面向对象编程,万物皆对象,以class为主,抽象化 2.POP 面向过程编程,万事皆过程,def定义过 ...
- BZOJ3293_分金币_KEY
题目传送门 设x[i]表示i+1向i传的糖果数,x[n]表示1向n传的糖果数,a'=(a[1]+...a[N])/N a[1]+x[1]−x[n]=a' a[2]+x[2]−x[1]=a' a[3]+ ...