智能合约(一)————智能合约入门
1、智能合约的基本组成
1.1.程序版本
1.2. 合约声明
1.3.状态变量
1.4.合约方法
在这里constant相当于他声明这个局部变量不能更改,但是他并没有实际作用(实际就只是警示作用)
2、地址adress
- address.balance 账户余额
- adress.transfer(value) 返回调用者
- adress.send(value) 返回调用状态
- adress.call,adress.callcode and adress.delegatecall 用在智能合约与智能合约彼此相互调用
3、ether单位
- wei
- szabo = 10^12wei
- finney=10^15wei
- ether=10^18wei
4、时间单位
- seconds
- minutes
- hours
- days
- weeks
- years
5、块
- block.blockhash(uint blockNumber) returns(bytes32)
- block.coinbase(adress) 谁挖到这个block
- block.difficulty(uint) 块难度
- block.gaslimit(uint) gas限制(最多)
- block.number(uint) 块的序号
- block.timestamp(uint) 块创建时间
- now
6、消息msg
- msg.data 消息携带的参数
- msg.gas(uint) 函数调用者所携带的gas数
- msg.sender(address) 函数调用者
- msg.sig
- msg.value(uint)
7、单员工薪酬智能合约实例
pragma solidity ^0.4.22;contract Pay{uint salary = 1 ether; //工资总额address frank =0x57ec6c8f13c46b43dcd28c83753dec9224d23ef2; //frank的账户地址uint constant payDuration = 30 days; //发放薪资的周期uint lastPayday = now; function addFund() payable returns(uint){return this.balance; //返回余额}function colculateRunway() returns(uint){return this.balance / salary; //返回余额能够发放工资的次数}function hasEnoughFund() returns(bool){return this.colculateRunway() > 0; //限制能够发放薪资的次数大于0次}function getPaid(){if(msg.sender != frank){revert(); //如果合约调用者不是frank 那么直接抛出异常}uint nextPayDay = lastPayday + payDuration; //如果重复使用一样的运算 第一是会浪费算力,还会浪费钱if( nextPayDay > now){revert(); //没到支付薪水时间}lastPayday = nextPayDay;frank.transfer(salary);}
}
8、错误检测
- assert(bool) 使用在程序运行时
- require(bool) 使用在程序输入时
9、多员工薪酬智能合约实例
pragma solidity ^0.4.22;contract Pay{uint constant payDuration = 10 seconds; //发放薪资的周期address owner;uint salary ; //工资总额address employee ; //frank的账户地址uint lastPayday; //构造函数名要和合约名字一样function pay(){owner = msg.sender;}function updateEmployee(address e,uint s){require(msg.sender == owner);//如果函数调用者不是当前owner,直接抛异常if(employee != 0x0){uint pament =salary * (now - lastPayday)/payDuration;employee.transfer(pament);}employee = e;salary = s * 1 ether;lastPayday = now;}function addFund() payable returns(uint){return this.balance; //返回余额}function colculateRunway() returns(uint){return this.balance / salary; //返回余额能够发放工资的次数}function hasEnoughFund() returns(bool){return this.colculateRunway() > 0; //限制能够发放薪资的次数大于0次}function getPaid(){//如果合约调用者必须是employee 那么直接抛出异常require(msg.sender == employee);uint nextPayDay = lastPayday + payDuration; //如果重复使用一样的运算 第一是会浪费算力,还会浪费钱assert(nextPayDay < now);//没到支付薪水时间lastPayday = nextPayDay;employee.transfer(salary);}
}
数组:
- 静态数组(uint[5] A) 定义好了就不能改变数组的长度
- 动态数组(uint[] B) 方法:length 查看数组长度push 只能用于动态数组
11、数据存储机制
- storage
- memory
- calldata强制
--状态变量:storage
--function输入参数:calldata默认:
--function返回参数:memory
--本地变量:storage规则
相同存储空间变量父子
--传递reference(evm上的地址空间)
不同存储空间变量赋值
--拷贝
12、数据结构优化
Mapping- 类似与map(C++),dict(python)
- key(bool,int,address,string)
- value(任何类型)
- mapping(address=>Employee) employees
- 只能做成员变量,不能做本地局部变量Mapping底层实现- 不使用数组+链表,不需要扩容
- hash函数keccak256hash,在storage上储存,理论上无限大的hash表- 无法naiive的遍历整个mapping
- 赋值employees[key] = value- 取值 value = employees[key]
- value是引用,在storage上存储,可以直接修改- 当key不存在,value= type's default
13、可视度及合约继承
- public 公共的 谁都可见
- private 只有当前合约可见
- external 只有外部调用可见
- internal 外部调用不可见,内部和子类可见
- 状态变量:public,internal,private- 默认internal- public:自动定义取值函数
14、modifier
modifier onlyOwner{_; 如果_;放在前面 那么require(msg.sender == owner);就要放在下次调用的return之前require(msg.sender == owner);}
智能合约(一)————智能合约入门相关推荐
- EOS智能合约与DApp开发入门教程
EOS的是Block.One主导研发的一个区块链底层公链系统,它专门为支撑商业去中心化应用(Decentralized Application)而设计,其代码开源. 比特币被称为区块链1.0,因为它开 ...
- EOS智能合约与DApp开发入门
# EOS智能合约与DApp开发入门 EOS智能合约与DApp开发入门,并最终完成一个基于React和 EOS的便签DApp. ## 终端使用建议 - 1#终端用于nodeos运行 - 2#终端用于k ...
- 从智能合约到智能资产
虽然智能合约仍然处于初始阶段,但是其潜力显而易见.想象一下,分配你的遗产就像滑动可调滑块就能 决定谁得到多少遗产一样简单.如果开发出足够简单的用户交互界面,它就能够解决许多法律难题,例如 更新遗嘱.一 ...
- BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图
BC之SC:区块链之智能合约--与传统合约的比较以及智能合约模型部署原理.运行原理相关配图 目录 SC与传统合约的比较 SC模型部署原理.运行原理 SC与传统合约的比较 1.传统合约VS智能合约 特 ...
- 智能合约怎么创建合约_可出售智能合约的协议
智能合约怎么创建合约 by Pablo Ruiz 帕勃罗·鲁伊斯(Pablo Ruiz) 可出售智能合约的协议 (A Protocol for Sellable Smart Contracts) Et ...
- 区块链技术最佳的监管方式是智能合约监管智能合约
区块链最新消息 1.在国内首部<区块链安全生存指南>发布 最新消息:比特大.长亭科技和ConsenSys陆联手发布了全国首部<区块链安全生存指南>.该指南围绕区块链技术安全,对 ...
- 蚂蚁区块链第10课 可信计算及TEE硬件隐私合约链智能合约开发实践
1,摘要 本文介绍可信计算分类INTEL SGX技术和ARM TRUSTZONE技术技术方案概要,以及应用INTEL SGX技术的蚂蚁区块链TEE硬件隐私链的智能合约开发实践. 2,可信计算和2种技术 ...
- 编写和部署智能合约:智能合约工具、remix、Truffle
第五章 文章目录 第五章 一.智能合约工具 二.remix 三.Truffle 总结 一.智能合约工具 智能合约的编译环境就是solidity的编译环境,智能合约的执行环境就是EVM. 二.remix ...
- 智能合约 与 外部账号之间转账,智能合约与智能合约之间转账
从外部账户向智能合约账户转账以太币 外部账户给部署智能合约时给合约初始转账: 使用remix 测试环境 pragma solidity >=0.4.0 <0.7.0;contract Te ...
- Nick Szabo:智能合约与传统合约的区别及其用途
Nick Szabo:密码学家,智能合约之父. 智能合约理念可追溯至1993年,为密码学家Nick Szabo所发明.自从以太坊引入智能合约之后,其在区块链领域被越来越多的人所熟知.本文正是Nick ...
最新文章
- stomp协议简介 服务器客户端通讯协议
- 【计算理论】计算复杂性 ( coNP 问题 | coNP 完全 | P、NP、coNP 相互关系 )
- 资源共享冲突问题概述
- 俄罗斯机器人雄鹿_在雄鹿无球可打,在火箭重获新生!哈登,你又让一人打出身价...
- 【游山玩水】三清山旅游行程
- 张量的通俗理解和计算
- Apache Karaf配置远程调试
- HIVE 一行转多行输出办法
- Linux(debian7)操作基础(十五)之systemd下lightdm免密登录
- 漫步数学分析十七——连续映射上的运算
- PyCharm 设置运行参数
- 我的毕业设计后端技术栈
- Java作业-圆柱体积
- Unity3D 使用UGUI实现公告牌
- 让你的nginx支持分布式追踪opentracing
- Linux环境非root用户配置SSH免密登录(配置原理)
- java获取首字母_【Java】获取中文首字母
- 获取保存在路由器中的ADSL账号和密码
- Java8中文api汉化文档下载【谷歌翻译最精准版】【jdk api 1.8_google.CHM】
- sql 删除唯一索引unique