函数定义、合约与面向对象(以太坊solidity合约)
- 1-函数定义、构造与多态
- 2-事件日志
- 3-面向对象特征
1-函数定义、构造与多态
创建合约就是创建类,部署合约就是实例化
合约的方法还支持多态
还能使用第三方的库进行开发
整个合约部署后,函数就是代码的执行单元
https://learnblockchain.cn/docs/solidity/structure-of-a-contract.html#structure-functions
函数也是一种类型是值类型
pragma solidity >=0.6.1 <0.7.0;// function (<parameter types>) {public private internal(默认)|external} [view|pure] [payable] [returns (<return types>)]
// 合约的函数支持多态(函数名称相同,参数类型或者数量不同)
contract FnDemo{string _name; // 引用类型 + storageuint _age; // 值类型不存在Data Location// 构造函数,合约在部署时自动调用,一般用来初始化状态变量
//deploy部署时,需要输入两个参数constructor(string memory name,uint age) public{_name = name;_age =age;}// private 仅仅在合约内部使用(所以合约部署后无法显示进行调用)// constant 0.4的版本使用,没有修改状态变量时可以设置,0.5版本使用View,Pure代替// view: 对状态变量(storage),只读但是不能写(状态变量部署会在账本,消耗gas)function getAll() private view returns (string storage,uint){return (_name,_age);}// public: 公共函数(当前、其它、继承的子合约都能调用), 如果参数引用类型必须设置内存变量memory
//从理论上将每个智能合约只能修改自己的状态变量,而不能修改别人的,即自己的storage不能让别人修改,所以设置为memory
// pure: 对状态变量不可读也不可写,在此函数中既没有操作状态变量,也没有读取function getAll(string memory name,uint age) public pure returns (string memory,uint){return (name,age+1);}// internal 受保护的函数,只能当前合约或者子合约调用// payable: 说明此方法有转账的操作,后面金额转账的操作比较多function getAll(string storage name) internal{getAll(); // 调用自己的private合约}}
2-事件日志
Solidity无打印功能,调试不便
使用事件event和log日志
https://learnblockchain.cn/docs/solidity/structure-of-a-contract.html#event
通过事件写入日志
间接使用事件实现打印的功能
pragma solidity >=0.6.1 <0.7.0;// solidity没有print,console.log方法,因此增加了调试的难度 ==> event + log来解决contract LogTest{// 事件名称采用驼峰命名法event LogData(string,uint);event LogData(string,string);function show(string memory name,uint age) public{age = age + 1;// 此处实现业务操作emit LogData(name,age);}function show(string memory name,string memory age) public{emit LogData(name,age);}
}
这些日志也会随着合约的调用存储到分布式账本
如支付宝转账有备注,此日志也具有此功能,后续进行调用转账函数的时候,可以写日志的,一旦交易成功会跟随数据一起写入分布式账本中,交易往来
单机一个区块
有交易,合约交易(合约的创建、调用、销毁(以后合约不能再使用))
https://cn.etherscan.com/txsInternal?block=12548200
一般众筹完毕不再接受新的众筹金币,合约就会销毁
只要每笔交易确认,当前交易日志就会写到分布式账本(测试时解决打印难题)
3-面向对象特征
https://learnblockchain.cn/docs/solidity/contracts.html
Solidity多继承,python单继承
抽象合约,函数只有声明没有实现,交给自合约实现,抽象合约无法编译
https://learnblockchain.cn/docs/solidity/contracts.html#abstract-contract
库在后续课程实战调用第三方的库
好的需求,可维护,设计
pragma solidity >=0.6.0 <0.7.0;// 手机OOP实现// 每个手机都有一样的开机与关机功能// 每个手机都有闹钟功能,但不同品牌的手机闹钟设计不同// 品牌手机实现Wifi与BlueTooth,但有些老年机只实现Wifi或者BlueTooth.interface Wifi{// external 说明当前函数只能被外界调用function wifi() external returns (string memory);
}interface BlueTooth{// external 说明当前函数只能被外界调用function blue() external returns (string memory);
}abstract contract Phone{ // 手机的父类(完成开机关机子)event ShowCall(string);//事件方式调用手机开机功能function start() internal{emit ShowCall('调用手机开机功能');}function close() internal{emit ShowCall('调用手机关机功能');}function alarm() virtual internal;//只有声明无实现(闹钟函数只能设计成抽象,每台手机对闹钟的实现各有不同,virtual 代表函数为抽象函数,solidity6)
}继承抽象合约phone
contract Mi is Phone,Wifi{//internal 不能被外界访问function alarm() internal override(Phone){emit ShowCall('小米实现闹钟功能');}function wifi() external override(Wifi) returns (string memory){return "小米实现wifi功能";}
}contract Iphone is Phone,Wifi,BlueTooth{function alarm() internal override(Phone){emit ShowCall('华为实现闹钟功能');}function wifi() external override(Wifi) returns (string memory){return "华为实现wifi功能";}function blue() external override(BlueTooth) returns (string memory){return "华为实现blueTooth功能";}function callAlarm() public{alarm();}
}
需要再回来好好的看看
返回华为实现了wifi功能
接口、抽象函数、抽象方法、乃至于实现