方法和匿名方法:

funcion name(<parameter types>){public|private|internal|external}[constant][payable][<return types>)]{}

payable代表是可以接受以太币的
方法有如下几种:
external
可以被其他合约调用,也可以使用内部直接调用,如果要调用的话,要用this.f()来进行调用
public
既可以被其他合约调用,也可以被内部直接调用
internal
只能在合约和其他子类合约中使用
private
只能在自己的合约内使用,子类中也不能使用'

pragma solidity ^0.4.;
//定义两个合约
contract C1{
uint public data=;
//下面定义了两个函数
function test(string _s) external returns(bytes32){
//返回的是32位字节类型
return keccak256(_s)//加密函数
}
function test2() public returns(uint){
//定义一个函数,后面是返回什么的类型,这里是不需要传参数进去的
return ;
} } contract C2{
//合约2来调用合约1的方法 bytes32 public b32;
uint public u;//定义变量
uint public kdata;//接收c1中的data C1 c1=new C1();
function test() returns (bytes32){
b32=c1.test("a)//调用c1里面的test方法
return b32
} function test2(){
b=c1.test2()
return b//return就好了
}

一个合约可以有一个匿名函数,此函数不能有参数,也不能有任何返回值,当我们企图去之执行一个合约上没有的函数的时候,那么合约就会执行这个匿名函数

此外,当合约在只收到以太币的时候,也会调用到这个匿名函数,而且一般情况下只会消耗很少的gas,所以当你接收到以太币的时候,想要操作一些的话,可以尽可能的把你要的操作写到匿名函数里面,因为这样的成本非常低

匿名函数例子:

//匿名函数
pragma solidity ^0.4.; contract C1{
uint public data; event e(address from ,uint _u );
function () payable {
data+=
e(msg.sender,data) }
contract CallC1{
event e(bool _b);
function CallC1() payable{ } function calltest(address add) returns (bool) {
bool b=add.call(bytes4(keccak256("setmoney")))//add.call调用匿名函数
e(b);
return b
}
}
}
}

new方法:(new)

一个合约是可以通过new关键字来创建另一个合约的

pragma solidity ^0.4.;

//定义一个合约D
contract D{
uint public x;//定义无符号的整数
uint public amount; function D(uint _a)payable{//D合约里面有两个方法,payable,以太币
x=_a;
amount=msg.value;//接收到了以太币,并且把这个以太币赋值给这个amount,可以得到以太币的数量
}
}

//定义合约E
contract E{
event e(uint x,uint amount);//定义一个事件出来
D d=new D()//D合约传递参数4,创建一个d对象出来,下面直接是取出d的值出来,想到与是给D合约发送以太币
function E(uint _u)payable{//payable是可以支付以太币的情况
e(d.x(),d.amount())//获取到D合约里面的两个值出来
D d1=new D(_u)//通过new方法创建d1合约
e(d1.x().d1.amount())//在打印出d后面参数的值出来 } function createD(uint _x,uint _amount) {
D d2=(new D).value(_amount)(_x)//当成以太币的数量发送给D合约,相当于是D合约里面msg.value
e(d2.x(),d2.amount())//得到后面的两个值出来,打印出来 }
}

继承:(is)

例子:

pragma solidity ^0.4.;

contract F{
uint internal u=;
function test() returns (uint){
//定义一个函数,返回什么类型的uint
return ; } }

//定义一个合约F1
contract F1{
uint public fu;
function F1(uint _u){
fu=_u//赋值操作,fu被赋值_u操作 }
} //下面子类直接继承父类,is就好了,继承父类F,F1,可以直接去里面的值
contract IsDemo is F,F1(){
uint public c1;//在赋值之前都是已经定义好的
uint public c2;
uint public c3; function c() {
c1=F.u;
c2=F.test();
c3=F1.fu;
}
}

枚举:(enum)

pragma solidity ^0.4.;

contract Purchase {
enum State { Created, Locked, Inactive } // 枚举
}

结构:(struct)

结构:structs
pragma solidity ^0.4.; contract Ballot {
struct Voter { // 结构
uint weight;//无符号int类型
bool voted;//布尔类型
address delegate;//申明地址,20个字节长度
uint vote;//无符号整数类型
}
}

Mappings:映射

delete:初始化原来的值,并不是删除掉

event(string _s,uint _u)//定义事件
uint public x=100//定义一个无符号的数出来
uint[] public xArray=[uint(1),3,5,2,3]//定义一个数组
delete x是把x初始化了,并不是删除掉了,把x变成默认的值,最原始的值

pragma solidity ^0.4.;
contract DeleteDemo {
uint public data = ;
uint[] public dataArray = [uint(),,];
event e(string _str,uint _u);
event eArr(string _str,uint[] _u); function doDelete(){
uint x = data;
e("x",x);
delete x;
e("after x",x); e("data",data);
delete data;
e("after data",data); uint[] y = dataArray;
eArr("y",y);
delete dataArray;
eArr("after y",y);
}
}

modifier:修改器

//修改器,有些时候只有合约的创建者才可以执行
//修改器可以用来改变方法的行为,比如在方法正式执行之前,检查方法是否满足条件,如果满足条件,则执行方法,不满足则可以抛出异常

//解释一下 ,这个执行合约的过程,就是说当执行的owner不是设定的原来的时候,就会抛出异常,当时原来的时候,就会执行相对应的方法

pragma solidity ^0.4.;

//注明一下,在这个合约里面定义了两个变量,一个是owner,一个是u,所以可以看到
contract modifyDemo{
address public owner;//声明一个地址账号
uint public u; function modifyDemo() {
owner=msg.sender//owner为当前消息得发送者,合约的部署者
} modifier onlyOwner{//注意modifier就是修改器,后面就跟着名称,没有括号得我
//修改器
if (msg.sender!=owner){
throw;//如果当前消息得发送者不等于owner的时候,就抛出异常
}else{
_;//固定写法
} function set(uint _u) onlyOwner{
u=_u;//符合的时候才会执行下面的方法,在合约页面的u就会被赋值_u,就是传进去的参数_u
}
}
}

selfdestory:自毁

//自毁,当执行之后发现右边不存在这个地址了,已经是销毁这个合约的状态了
pragma solidity ^0.4.; contract selfdestoryDemo{
uint internal u=;
function test() returns(uint){
return ;
} function selfdestoryDemo() payable{
//当执行这个合约的时候,可以向这个合约发送一些以太币
}
function kill(address add){
selfdestory(add)
}
}

Solidity基础的更多相关文章

  1. 区块链入门到实战(30)之Solidity – 基础语法

    一个 Solidity 源文件可以包含任意数量的合约定义.import指令和pragma指令. 让我们从一个简单的 Solidity 源程序开始.下面是一个 Solidity 源文件的例子: prag ...

  2. solidity基础知识

    1.solidity是一种语法类似JavaScript的高级语言,它被设计成以编译的方式生成以太坊虚拟机代码.在后续的内容中你将会发现,使用它很容易创建用于投票.众筹.封闭拍卖.多重签名钱包等等的合约 ...

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

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

  4. 智能合约语言Solidity教程系列2 - 地址类型介绍

    智能合约语言Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你 ...

  5. 智能合约语言 Solidity 教程系列6 - 结构体与映射

    写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本系列文章一部分是参考Solidity官方文档(当前最新版 ...

  6. Solidity 中文文档 —— 第一章:Introduction to Smart Contracts

    第一章:智能合约简介 粗略地翻译了 Ethereum 的智能合约开发语言的文档:Solidity.欢迎转载,注明出处. 有任何问题请联系我,本人微信:wx1076869692,更多详情见文末. 我是 ...

  7. 智能合约语言 Solidity 教程系列2 - 地址类型介绍

    Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是 ...

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

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

  9. PBFT概念与Go语言入门(Tendermint基础)

    Tendermint作为当前最知名且实用的PBFT框架,网上资料并不很多,而实现Tendermint和以太坊的Go语言,由于相对小众,也存在资料匮乏和模糊错漏的问题.本文简单介绍PBFT概念和Go语言 ...

随机推荐

  1. SpringBoot系列: Eclipse+Maven环境准备

    这个链接比我写得更全面, http://tengj.top/2018/01/01/maven/ =============================20190115补充: maven 的一些插件 ...

  2. es6 javascript对象方法Object.assign() 对象的合并复制等

    Object.assign方法用于对象的合并,将源对象( source )的所有可枚举属性,复制到目标对象( target ). 详细使用稳步到前辈: http://blog.csdn.net/qq_ ...

  3. ****** 四十九 ******、软设笔记【UML分析和意义】-建模的意义,UML的特点、结构,用例图

    UML UML又称同一建模语言或标准建模语言,是一个支持模型化和软件系统开发的图形化语言,它的作用域不仅支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程. 建模的意义: 模型是对现实的 ...

  4. 七、文件IO——I/O处理方式和文件锁

    7.1 I/O 处理方式 7.1.1 I/O处理的五种模型 阻塞I/O模型 若所调用的 I/O 函数没有完成相关的功能就会使进程挂起,直到相关数据到达才会返回.如 终端.网络设备的访问. 非阻塞模型 ...

  5. 【核心】project(idea文件)、module(iml文件)到SSM集成、热部署、Tomcat启动、MAVEN依赖冲突

    http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/project-composition-introduce.html 在 Inte ...

  6. [C++]Linux之多进程运行代码框架

    声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0  多进程代码框架示例 /* @url: ...

  7. cocos2dx 3.3 笔记

    ccs3 加入了 rapidjson ->一个JSON解析库https://github.com/miloyip/rapidjson

  8. JavaScript面试技巧(二):JS-Web-API

    1.从基础知识到JSWebAPI 2.DOM 本质 节点操作 结构操作 3.BOM 4.事件 5.Ajax XMLHttpRequst 跨域 6.存储

  9. 表单相关标签之input标签

    用于搜集用户信息. <input type="text" name="fname" /> 标签属性 type 规定 input 元素的类型.输入字段 ...

  10. EL知识点总结

    EL知识点总结 - canger - 博客园http://www.cnblogs.com/canger/p/6675799.html 1 只可以获取内置对象的属性值,不可以获取JSP页面中局部java ...