[区块链笔记1] 入坑区块链 智能合约solidity基础
以太坊是一个分布式计算网络,提供了运行智能合约的分布式平台。
智能合约是在以太坊虚拟机上运行的应用程序。
以太坊拥有多种高级语言可以用来编写智能合约,最流行的是solidity,基于javascript。
remix ide是一个智能合约开发的IDE
第一个代码
pragma solidity ^0.4.0; //向上兼容到0.5.0以下
contract Demo{string str = "hello world";function getStr() public view returns(string){return str;}function setStr(string t_str) public{str = t_str;}function pureTest(string t_str) public pure returns(string){return t_str;}
}
节省gas(或者说ether)的两个关键字
view修饰的函数可以读取状态变量但是不能改
pure修饰的函数不能改也不能读状态变量
int/uint类型
整形变量:int8/uint8~int256/uint256,步长为8,int/uint=int256/uint256,即256位二进制位
数组
固定长度字节数组:bytes1,bytes2…bytes32,步长为1,1byte=8bit;正好和int/uint位数对应
bytes类型的变量可以通过length属性访问长度
不定长字节数组:bytes arr=new bytes(2);
//分配两个字节数组
不定长数组长度可以改变,自动在右侧添加0x00填充
可通过push操作向后面添加数据,push的过程会自动增加数组长度
bytes arr = new bytes(2);function setArr() public{arr[0]=0x01; arr[1]=0x02;}function getArr() public view returns(uint){return arr.length;} function pushData() public {//arr.length = 3;arr.push(0x03);}
string类型
string没有length属性,也不可以通过下标的方式来获取其中元素。
注意string中存储中文一个占3个字节
string转bytes
string str="hello world";function getLength() public view returns (uint){return bytes(str).length;}function getStr() public view returns (bytes){return bytes(str);}function getChar() public view returns (bytes1){return bytes(str)[0];}function opChar() public {bytes(str)[0] = 'x';}
bytes转string
bytes byteStr = new bytes(2);function init() public {byteStr[0]=0x68; byteStr[1]=0x65;}function getStr() public view returns (string){return string(byteStr);}
bytes10转string
function bytes10ToString(bytes10 byteStr) public pure returns (string){uint count=0;for (uint i=0; i<byteStr.length; i++){if (byteStr[i]!=0x00){count++;}else{break;}}bytes memory bytesStr = new bytes(count);for (uint j=0; j<count; j++){bytesStr[j] = byteStr[j];}return string(bytesStr);}
固定长度字节数组截取
bytes8 byteStr = 0x1234567891234567;function getbyte1() public view returns (bytes1){return bytes1(byteStr);}function getbyte10() public view returns (bytes10){return bytes10(byteStr);}
固定长度字节数组转可变长度字节数组
bytes8 byteStr = 0x1234567891234567;function getDynamicStr() public view returns (bytes){bytes memory tStr = new bytes(byteStr.length);for (uint i=0; i<byteStr.length; i++){tStr[i] = byteStr[i];}return tStr;}
int/uint数组
一维固定长度数组
int[5] arr = [];
固定长度数组只可以访问length,不能改变
二维固定长度数组
int[2][3] arr;
表示有3个元素,每个元素占两个int.
当在访问下标是又变成[i][j],第i行第j列
一维可变长度数组
int[] arr = [];
可变长度数组可以修改length, push元素
二维可变长度数组
int[][] arr = [[1,2], [3,4], [5,6]];
可以修改外层长度和内层长度,但是没有push方法
地址address是用uint160来存储的
address public p;address public p = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;function getAddress() public view returns (uint160){return uint160(p);}uint public pData = 1154414090619811796818182302139415280051214250812;function getAddress2() public view returns (address){return address(pData);}
payable关键字代表可以通过这个函数给合约地址转账,默认转账单位是位
this代表合约的地址
通过合约/账户地址的属性balance可以获取合约/账户的ether
通过外部账户向合约转账
contract Demo{function getBalance() payable public {}function showBalance() public view returns (uint){return uint(this.balance);}function showRandBalance(address p) public view returns (uint) {return uint(this.balance);}
}
外部账户转账给其他账户
contract Demo{function trans() public payable {address p = 0xca35b7d915458ef540ade6068dfe2f44e8fa733c;p.transfer(msg.value);}
}
外部账户转账给合约
contract Demo{function showBalance() public view returns(uint){return this.balance;}function trans2() public payable {this.transfer(msg.value);}function() payable {}
}
全局变量
msg.sender:合约的调用者(账户)的地址
msg.value:当前消息附带的以太币
block.number:当前区块块号
block.difficulty:当前块的困难度
mapping用法,注意输入地址的时候要用双引号
contract Demo{mapping(address => uint) idMap;mapping(uint => string) strMap;uint public pos=0;function func(string str) public {pos++;address p = msg.sender;idMap[p] = pos;strMap[pos] = str;}function getIdByAddress(address ad) public view returns(uint){return idMap[ad];}function getStrById(uint id) public view returns (string) {return strMap[id];}
}
多返回值
contract Demo{function test(uint a, uint b) public view returns(uint res1, uint res2){return (a+b, a-b);}function test2(uint a, uint b) public view returns(uint res1, uint res2){res1 = a+b;res2 = a-b;}
}
solidity中的构造函数只能有一个
老版本中可以用和类名相同的函数名作为构造函数
新版本中可以使用关键字constructor作为构造函数
contract Demo{int public n;// function Demo() public {// n = 5;// }constructor() public{n=6;}
}
require函数,当判断条件为真,继续执行下面语句;否则下面语句都不执行
modefier关键字
contract Demo{address public owner;int public n;constructor() public {owner = msg.sender;}modifier onlyOwner() {require(owner == msg.sender);_; //动态添加代码}function func(int tn) onlyOwner {n = tn;}
}
modifier代码重用示例
contract Demo{uint public level=5;uint public flag=0;modifier func(uint needLevel){require(level>=needLevel);_;}function func1() func(2){flag=1;}function func2() func(6){flag=2;}
}
深入modifier, 执行顺序:x=1,x=3,x=5,x=4,x=2
contract Demo{int public x;modifier mod1() {x=1;_;x=2;}modifier mod2() {x=3;_;x=4;}function test() mod1 mod2 {x=5;}
}
继承使用is关键字, 对象可以连续继承,也可多继承:
contract son is father, mother
父类中的变量不加修饰的时候,子类中默认(public)可以访问
父类对象中的internal修饰的成员,子类中也可以访问。在合约内可访问,外部不可访问。
父类对象中的private修饰的成员,子合约中不可以访问
父类对象中的external修饰的成员不可以在合约中访问或调用,只能在合约外部访问或调用
说明
相对于C++
public->public
private->private
internal->protected
C++中的类在这里叫合约
constant在函数中的用法被抛弃,在全局变量中,只用于byte1-byte32,int,uint,string,表示数据不可被修改
public修饰的成员会默认生成getter方法,供外部调用
比如,其中的x方法就是自动生成的,但是当我们显示写了这个函数后,就不会自动生成默认的x方法了
contract Demo{int public x;function x() external view returns(int) {return x;}
}
合约的销毁
contract Demo{address owner;int x = 0;constructor() public {owner = msg.sender;}function increase() public returns (int) {x = x+10;return x;}function destruct() public {if (owner == msg.sender){selfdestruct(owner);}}
}
结构体的使用
contract Demo{struct student{string name;uint grade;}function func1() public view returns (string, uint) {student memory t = student("name1", 100);return (t.name, t.grade);} function func2() public view returns (string, uint) {student memory t = student({name:"name2", grade:99});return (t.name, t.grade);}
}
不能包含本身,但是可以是动态的数组或者mapping等类型
注意memory定义的结构体,不可以直接操作结构体中的mapping
但是可以操作在合约内部默认storage定义的结构体中的mapping
storage可以看成C++中的引用
contract Demo{struct student{string name;uint grade;}student stu;function test(student storage st) internal {student storage s = st;s.grade = 100;}function func() public view returns(uint) {test(stu);return stu.grade;}
}
memory类型的变量传递是通过指针来传递的
枚举类型
enum day{monday, thusday, wendesday}
综合示例:众筹功能代码
pragma solidity ^0.4.0;contract Charity{struct Payer{address payerAddress;uint payMoney;}struct Needer{address neederAddress;uint goal;uint curMoney;uint payerCount;mapping(uint => Payer) map;}uint neederCount;mapping(uint => Needer) needMap;function newNeeder(address _neederAddress, uint _goal) public {neederCount++;needMap[neederCount] = Needer(_neederAddress, _goal, 0, 0);}function pay(address _address, uint _neederPos) payable {Needer storage _needer = needMap[_neederPos];_needer.curMoney += msg.value;_needer.payerCount++;_needer.map[ _needer.payerCount] = Payer(_address, msg.value);}function trans(uint _neederPos){Needer storage _needer = needMap[_neederPos];if (_needer.curMoney <= _needer.goal){_needer.neederAddress.transfer(_needer.curMoney);}}function show(uint _neederPos) public view returns (uint, uint, uint) {Needer storage _needer = needMap[_neederPos];return(_needer.goal, _needer.curMoney, _needer.payerCount);}
}
[区块链笔记1] 入坑区块链 智能合约solidity基础相关推荐
- 区块链开发入门:基于以太坊智能合约构建 ICO DApp
写给前端开发者的第一本区块链开发入门指南,通过从 0 到 1 实战开发一个 ICO DApp 项目(基于 V 神的 DAICO 设计思想),深入掌握区块链及以太坊技术. 为什么要选择区块链开发? 未来 ...
- solidity payable_以太坊区块链搭建与使用(五)-智能合约Solidity
一.智能合约Solidity开发工具 1.remix-ide http://remix.ethereum.org/ 在线版本,也可以去github下载安装到本地.开发.编译.发布.执行.测试 2.re ...
- 区块链技术最佳的监管方式是智能合约监管智能合约
区块链最新消息 1.在国内首部<区块链安全生存指南>发布 最新消息:比特大.长亭科技和ConsenSys陆联手发布了全国首部<区块链安全生存指南>.该指南围绕区块链技术安全,对 ...
- 区块链项目实战 - 使用以太坊/智能合约solidity,全栈开发区块链借贷记账小应用,含完整源码
本文使用区块链平台以太坊+智能合约实现一个区块链记账的功能,具体为: 借款人和贷款人以及数额被记录在区块链中.使用区块链地址来表示借款人或者贷款人. 若一个借款人多次向一个贷款人借钱,更新所有的数额之 ...
- 区块链智能合约solidity入门
想知道更多关于区块链技术知识,请百度[链客区块链技术问答社区] 链客,有问必答!! 使用ubuntu系统安装ethereum开发环境 安装 Nodejs sudo apt-get update sud ...
- 区块链智能合约solidity入门 1
使用ubuntu系统安装ethereum开发环境 安装 Nodejs sudo apt-get updatesudo apt install curlcurl -sL https://deb.node ...
- 10本区块链热门图书(应用开发、智能合约等)免费送!
欢迎访问网易云社区,了解更多网易技术产品运营经验. "互联网之后就是区块链时代,区块链是实现未来跟踪经济的关键技术."世界上真的存在 100% 去中心化的系统吗?区块链到底是什么? ...
- 区块链智能合约solidity的中的一些关键字
目 录 pragma mapping msg对象 block对象 contract constructor struct 数据地址 地址类型 address payable revert 以下场景使 ...
- GRE:区块链将引领传统保险走向风险智能合约的时代变革
点击上方 "蓝色字" 可关注我们! 编辑:铅笔盒 北京时间3月28日,每月两次的行业盛会[ ICT创新创业"深度脑洞聚会"]在上海举行,目前已举办235期.历时 ...
最新文章
- 【Java_基础】Java中Native关键字的作用
- CSS3透明属性opacity
- 设计模式-中介者模式(21)
- Activity之launchMode:singleTop,singleTask与singleInstance
- 2016,你最不应该错过的热门技术文章
- C语言指针超全面透析(原来你一直没有搞懂C语言指针是因为没有理解其中的规律)
- 你知道这5年我怎么过的吗!谈谈我做测试开发的这些年……【总结】
- weblogic控制台超时时间_WebLogic如何设置session超时时间
- 高效记忆/形象记忆(14)110数字编码表 81-90
- MATLAB简介与桌面系统
- 单维度量表验证性因子分析_探索性因子分析(EFA)和验证性因子分析(CFA)
- 疼痛共情ERP成分解析
- 日文输入键盘罗马字对应表
- 在Mac上模拟IE浏览器
- 明朝经典战役\明朝挽救历史狂澜\于谦人生最高点\北京保卫战
- 云计算--day07
- Oracle11g新特性之Replay a captured workload 捕获工作负载新环境重放负载测试压力
- PYTHON学习概述
- idea中使用git相关操作说明
- 校园招聘部分公司薪资待遇
热门文章
- Ten Rules of Good Studying
- install quantopian时出现No module named pip.req的解决办法
- 系统架构师论文-论软件架构的选择与应用
- Android自定义相机镂空遮罩
- 【ZZULIOJ】1026: 字符类型判断
- 2022年国家高新技术企业申报秘笈来了
- 视频 | 苏炳添的“冠军卧室”曝光,来看看百米飞人的另一面
- 计算机硬件常见配件的性能指标,计算机硬件的功能和功能
- ACM教程 - 卡特兰数(Catalan)算法
- 【博弈论】POJ[2348]Euclid's Game