以太坊智能合约开发:solidity精简速成版

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

以太坊智能合约开发:solidity精简速成版


一、相关概念

  1. 以太坊:以太坊是一个分布式的平台,可以运行智能合约,应用程序按照既定的程序运行,不会出现停机、审查、欺诈或第三方干扰的可能性。一句话总结就是,以太坊就是一个基于区块链的智能合约平台。
  2. 智能合约:是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick Szabo首次提出。
  3. 燃料gas:部署智能合约在以太网络中需要消耗一定的燃料(gas),gas需要用以太币进行兑换。

二、solidity编程基础

(1)引入其他源文件:①import “./filename.sol”; ②import * as symbol from “filename”;
(2)函数:function A{…}。
(3)合约:contract A{…}。
(4)接口:interface A{…}(接口只定义行为,没有实现)。
(5)库:library A{}(库没有fallback函数和payable关键字,不能定义storage变量)
(6)构造函数:constructor () public{manager = msg.sender; }
其他声明方法function()public{…}和function[与合约同名]{…}
(7)事件(event):

event Sent(address From, address To, uint Amount);//声明事件 Sent,用来记录转账过程
Function sent(address _From, address _To, uint _Amount){
	emit sent(_From, _To,_Amount);
}

事件和日志的主要用途:

  • 智能合约返回值给用户接口:从智能合约返回值给app前端
  • 异步带数据的触发器
  • 一种比较便宜的存储

(8)值变量:

  • 布尔型(bool):值为false和true。(在solidity中1并不代表true)
  • 整型(uint和int):无符号整型(uint)和有符号整型(int)。
  • 地址:以太坊地址address。Addr.balance属性查看地址余额,addr.transfer属性向该地址发送以太币
  • 定长字节数组:bytes1,bytes2,bytes3…bytes32。
  • 枚举类型:enums。

(9)引用类型:

  • 不定长字节数组:byte[]
  • 字符串:string。
  • 数组:
  • 结构体:struct A{…}。

(10)字典映射:
字典是一种Key/Value对,通过映射(mapping)定义。映射本质上是存储和查找数据所用的键值对,类似于可以用任意类型表示下标的数组,mapping( Key=>Value)表示这个映射可以用Key类型作为下标,同时存储的值是Value类型。如: mapping (address => uint) public balance;(其中address是键的数据类型,uint是值的数据类型。可以用balance[x]获取uint类型的值,其中x是address类型)。

mapping (address => uint) public balances;
function reward (address receiver,uint amount) public {
	balances[receiver] += amount;  
	//balances[receiver]中,receiver是接收者的地址balances[receiver]是receiver这个地址中的余额。
}

(11)函数定义以及修饰符
函数定义:function <函数名> ([<输入参数类型1> <输入参数名1>],…) [internal(默认)|external] [pure|constant|view|payable] [returns([<返回参数类型1> <返回参数名1>],…)] {…}

  • Internal和external
    Internal声明的函数和状态变量只能通过内部访问(在当前合约调用或继承的合约内调用)。External声明的函数是外部函数,是合约接口的一部分,可以从其他合约或通过交易发起调用(通过this.f()调用)。
  • Public和private
    Public修饰公开函数,是合约接口的一部分,可以通过内部或通过交易来发起调用。 对于public类型的状态变量,会自动创建一个访问器。
    Private修饰的私有函数和状态变量仅在当前合约中可以访问,在继承的合约内不可访问
  • Constant,View和Pure
    constant修饰的函数没有能力改变区块链上的状态变量,但可以读取状态变量并返回给调用者。View相当于constant,声明的函数不能改变状态变量。Pure修饰的函数既不更改也不读取状态变量。
  • Payable修饰符
    一个函数声明为Payable,它就只能收取ether。
    注:
    ① Internal内部可见,即当前合约和继承合约;external只能外部可见;public在外部和内部均可见;private只能当前合约,不能在继承合约。
    尽量使用internal,消耗gas最少,如果确定只能外部调用尽量使用external,public消耗gas最多。
  • 自定义修饰符(modifier)
    修饰符可以用来改变函数的行为,例如可以用来执行一个函数前检查一个条件。修饰符可以继承,而且可以被派生合约重载。
    声明函数修饰器,将其加在函数中,在函数执行前进行判断,来检查调用者是否为学生本人,只有本人才能调用该函数:
modifier onlyOwner() {   
   require (msg.sender == owner,”only owner can call this function”);
  _;            //被onlyOwner声明的函数会被加到修饰定义里的_;之后执行。也就是说被声明的函数会在这里执行,否则就会引发异常调用
}                 
contract Mortal is owned{
	function close() public onlyOwner{....}   }

(12)数据位置Storage:可以被所有函数访问的全局变量。永久的存储,以太坊会把它存到公链环境里的每一个节点。消耗gas最多。
Memory:智能合约中的本地内存变量。它的声明周期很短,当函数执行结束后就被销毁了。消耗gas最少。
Calldate:所有函数调用的数据,包括参数的保存位置。
默认函数参数是memory,默认局部变量是storage;默认状态变量是storage。外部函数的参数被强制指定为calldate。
(13)继承:单继承contract A is B{…} | function A(…) B(…){…}
多重继承contract A is B{…} contract C is A,B{…}
(14)异常和错误处理:
Require函数:require (msg.sender == owner,”only owner can call this function”);
Revert函数:if(msg.sender != owner) revert(“only owner can call this function”);
通常与函数修饰器modifier一起用。
(15)常用全局变量:
msg.sender(address):消息发送者
(16)错误处理:
(17)结构体:struct A{…}

struct student{
        string name;
        uint256 age;
    }
    function init() returns (string,uint256){
        student memory s = student("XXX",87);
        student memory s2 = student({age:77,name:"SSS"});
        return (s.name,s2.age);
    }

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以太坊智能合约开发环境及总结 今年上半年开始接触基于区块链的以太坊智能合约编程。由于⽹络现有资料⼤多使⽤truffle2.0框架,⽽更新的truffle3.0在使⽤习惯上有 较⼤改动,很多教程已经不太适合新⼿使⽤。这⾥在吸收了部分⽹络资源,及多次⾃我尝试后,较为详细总结了linux系统下利⽤ truffle3.0+testrpc完成以太坊智能合约+DApp开发⽤到的环境搭建过程,并归纳了开发过程中遇到的⼀些问题及解决⽅案,合约编程语 ⾔为solidity。 环境搭建 (打开终端:同时按住Ctrl + Alt + T键) 1.安装git sudo apt-get install git * 如果在安装git时出现E:Package 'git' has no installation candidate错误提⽰,即可使⽤:sudo apt-get install git-core * git --version 查看是否安装成功 2.安装nodejs sudo apt-get install curl sudo apt-get install -y nodejs * nodejs -v 查看是否安装成功 3.安装solc和solc-cli sudo npm install -g solc solc-cli --save-dev * solcjs --help查看是否安装成功 4.安装solc⼆进制包(使⽤geth要⽤到) sudo add-apt-repository ppa:ethereum/ethereum sudo apt-get update sudo apt-get install solc 4.1 建⽴软链接(可不⽤) 5.安装testrpc sudo npm install -g ethereumjs-testrpc * testrpc安装失败,找不到script,解决⽅法可参考 * testrpc 查看是否安装成功 6.安装truffle3.0 sudo npm install -g truffle * truffle version 查看是否安装成功 7.安装Geth sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:ethereum/ethereum sudo apt-get update sudo apt-get install ethereum Truffle3.0使⽤教程(按顺序) 窗⼝1: mkdir myproject 新建⼦⽬录 cd myproject truffle init webpack初始化项⽬ truffle compile 编译 窗⼝2: testrpc 启动testrpc 窗⼝1: truffle migrate (truffle2.0以上)部署项⽬ npm run build truffle serve 启动服务 窗⼝3: *运⾏多次时可能报错,将后两个指令改为npm run dev 项⽬⽂档说明 app/:存放前端javascript⽂件和stylesheets⽂件,在开发Dapps时使⽤; contracts/:智能合约⽂件的存放⽬录; migrations/:存放部署脚本; test/:存放智能合约测试⽂件 DApp开发总结(truffle3.0) 1.对于⼀个不会改写区块链状态的f()函数,使⽤instance.f.call();⽽对于⼀个会改写区块链状态的函数f(),使⽤instance.f()。底层在实 现调⽤上,会使⽤不同gas计算⽅式。 2.报错invalid address 原因:未设置默认账户地址 解决⽅案: Test.defaults({ from : "0x299127d72e28cb92d09f856aaedeb139d1e7e74a" }); *Test是合约初始化变量 3.合约交互抽象层语法 MyContract.setProvider(someWeb3Provider); MyContract.deployed().then(function(instance) { return instance.someFunction(); }).then(function(result) { }); 4.DApp界⾯读写数据 4.1 整型 var test = parseInt(document.getElementById("test").value); meta.write(test); meta.read.call().then(function(value) { var value_element = document.getElementByI

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值