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年的第一天 ...
随机推荐
- Java中的IO流(四)
上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...
- #leetcode刷题之路37-解数独
编写一个程序,通过已填充的空格来解决数独问题.一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 在每一个以粗实线分隔的 3x3 宫内只 ...
- java 计算器算法脚本
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public String Count(Strin ...
- Spring : JPA的单独使用
title: 如何单独使用spring data jpa 引用pom文件: <dependency> <groupId>org.springframework.data< ...
- 初学者:__init__.py文件的作用
__init__.py 文件的作用及意义 __init__.py文件是一个包必须的文件,即使它是空的,但也是必须的,如果没有这个文件,python将不会把该文件夹当做一个package,而仅仅是一个d ...
- java的值传递机制
一.练习:编写Java程序,将二维数组中的行列互调显示出来. 代码1为自己编写: package com.xxgpra.CH6; public class Hangliehudiao_pra4 { p ...
- 利用cross-entropy cost代替quadratic cost来获得更好的收敛
1.从方差代价函数说起(Quadratic cost) 代价函数经常用方差代价函数(即采用均方误差MSE),比如对于一个神经元(单输入单输出,sigmoid函数),定义其代价函数为: 其中y是我们期望 ...
- mybatis入门(二):增删改查
mybatis的原理: 1.mybatis是一个持久层框架,是apache下的顶级项目 mybatis托管到googlecode下,目前托管到了github下面 2.mybatis可以将向prepar ...
- 西安Uber优步司机奖励政策(12月28日到1月3日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- day 5 模块发布安装
1.模块的位置 现在当前路径查找,再到系统路径/usr/lib/python3.5/查找,再到其他系统路径查找 2.模块发布 1)模块目录结构 Msg ├── __init__.py ├── recv ...