智能合约(一)————智能合约入门

article/2025/9/13 5:32:08

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);}

http://chatgpt.dhexx.cn/article/6ZjmXS6M.shtml

相关文章

EOS 智能合约源代码解读 (10)token合约“简介”

1. 记录用户的token&#xff0c;比如有哪些代币 class [[eosio::contract("eosio.token")]] token : public contract {public:using contract::contract;[[eosio::action]]void _create( const text_name& issuer, const asset& maximum_supply);[[eosi…

区块链智能合约介绍

作者&#xff1a;qinyutong、chengyueqiang 智能合约 (smart contract) 是一种由事件驱动的、具有状态的代码合约和算法合同 [11]&#xff0c;随着以比特币为代表的区块链技术的蓬勃发展, 区块链技术已经开始逐步超越可编程货币时代而进入智能合约时代。智能合约作为区块链的核…

智能合约简介

区块链技术简史 区块链技术的第一次应用是在2008年&#xff0c;当时比特币首次亮相。抛弃传统金融机构&#xff0c;比特币引入了促进数字金融交易的新方法。然而&#xff0c;尽管在当时这是革命性的举措&#xff0c;但在这种状态下&#xff0c;区块链技术无法得到广泛应用。 区…

十分钟教你开发EOS智能合约

在CSDN、柏链道捷&#xff08;PDJ Education&#xff09;、HelloEOS、中关村区块链产业联盟主办的「EOS入门及最新技术解读」专场沙龙上&#xff0c;柏链道捷&#xff08;PDJ Education&#xff09;CTO、副总裁康烁&#xff0c;作了「如何在EOS上开发智能合约」的精彩演讲。演讲…

智能合约--如何实现可升级的智能合约

一. 什么是智能合约 智能合约通俗点说就是写在区块链上面的代码&#xff0c;代码里面编写着严谨完善的规则&#xff0c;一旦某个用户满足了合约里面的规则条件&#xff0c;就会触发里面的代码&#xff0c;执行某个方法。 二. 为什么要使智能合约达到可升级 智能合约的特点之一…

智能合约简单介绍

本学期学习了区块链的课程&#xff0c;作业是对于智能合约学习后的报告&#xff1a; 1 智能合约简单了解 1.1智能合约是什么 智能合约是由事件驱动的、具有状态的、部署于可共享的分布式数据库上的计算机程序&#xff0c;多用IF-THEN语句。狭义来说&#xff0c;智能合约是设计…

智能合约

智能合约&#xff08;英语&#xff1a;Smart contract &#xff09;是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。[1]智能合约概念于1994年由Nick Szabo首次提出。智能合同的目的是提供…

[EOS源码分析]6.EOS特殊智能合约eosio

这里说的eosio智能合约不是泛指eos的智能合约&#xff0c;它是一个特殊的具体的合约。它本事可大了&#xff0c;我们一起来看看它有哪些功能 负责智能合约部署 大家有注意到如下红色字体的log吗 $ cleos set contract hello.code ../eos-contract/hello -p hello.code Publish…

EOS智能合约开发(一)

一、 智能合约功能二、 通讯模式 2.1 运行机制2.2 内联通信2.3 延迟通信2.4 交易和动作2.5 交易确认2.6 动作处理程序和动作的apply上下文2.7 交易限制 三、文件结构 3.1 创建框架3.2 apply处理程序3.3 EOSIO_ABI 宏 四、多索引数据库API 4.1 EOSIO多索引API4.2 EOSIO多索引迭代…

EOS系列 - WASM智能合约 - 特性

构造函数 addressbook(name receiver, name code, datastream<const char*> ds):contract(receiver, code, ds) {}#单例表&#xff08;code和scope都用receiver的表&#xff09;也可在初始化列表中实例化 singleton_example( name receiver, name code, datastream<c…

EOS智能合约开发(十五)EOS 状态机架构解析

好久没有写文章了&#xff0c;最近公司事情比较忙。非常感谢上次杭州团队一位负责EOS状态机的同事精彩分享。今天查阅很多资料后&#xff0c;整理这篇文章&#xff0c;希望对大家有所帮助。 EOS状态机是什么&#xff1f; 简单讲就是数据库&#xff0c;是EOS记录智能合约执行结…

接口测试时,输入所有参数的参数值后,接口返回“参数错误:所有参数都不能为空”

问题原因&#xff1a; 参数名称输入有误&#xff0c;前台&#xff08;pwd&#xff09;和后台&#xff08;password&#xff09;的参数名称不一致 &#xff0c;保持一致后即可

matlab 错误使用 connector.internal.autostart.run输入参数的数目不足。

matlab打开后提示&#xff1a; 错误使用 connector.internal.autostart.run输入参数的数目不足 原因&#xff1a;自己写的一个函数和matlab自带的函数重名了 参考&#xff1a;警告: 在 matlabrc 中初始化 Java 首选项失败 – MATLAB中文论坛MATLAB中文论坛MATLAB 基础讨论板块…

Matlab 自带遗传算法函数 ga() 运行报错:“ fitnessfcn() 输入参数的数目不足。”

原始程序 %主程序 m [1 2]; R [1.5 1]; epsilon [2^R(1)-1 2^R(2) - 1]; A [-1 epsilon(1); 0 -1]; b [0 0]; Aeq [1 1]; Beq 1;%matlab自带函数包 [x_optimal, fval] ga(fitnessfcn, 2, A, b, Aeq, Beq, [0;0], [1;1], []); ---------------------------------…

matlab函数参数不足,调用函数显示输入参数不足

问题描述.png (29.7 KB, 下载次数: 1) 2015-1-27 09:34 上传 %Gauss-Newton算法实现如下 function[x,minf] = GN(f,x0,var,eps)formatlong; ifnargin == 3 %如果没有设置eps,则eps=1.0e-6eps = 1.0e-6; end m = 0; S =transpose(f)*f; %trnspose是转…

matlab 函数不定参数,matlab function定义一个函数,但一直出来说输入参数数目不足。我用的是2014版本,不知道数目原因啊?...

www.mh456.com防采集。 h 5;g 1; % g取源0有问题% 被积函数2113可以化5261简成f 4102(a,b,r)(r*h-r^16532*cos(a-b))/(h^2r^2g^2-2*h*r*cos(a-b))^1.5;% 求积分quadv((r)quadv((b)quadv((a)f(a,b,r), 0, 2*pi), 0, 2*pi), 0, h) 错误在于&#xff0c;调用函数f( x )缺一个…

matlab plot输入参数太多,输入参数太多问题

版本&#xff1a;R2016a 利用SCE-UA调用新安江模型进行率定时&#xff0c;显示参数太多&#xff0c;求大神指导。 clear; clc; spathcd P0(textread([spath,\matlabxingshanjiangyu.txt])); PP0(2,:);%降水量(mm) EI0(textread([spath,\matlabxingshanzhengfa.txt])); EIEI0(2,…

参数输入太多

参数输入太多 在向platEMO平台添加新的算法时&#xff0c;可能会出现参数输入太多的错误提示 可能是由于输入的参数内包含逗号&#xff0c;比如 a[1,2],b[3,4] 从而造成”输入参数太多“的错误提示。

MATLAB S-function(教程分享) 报错 flag = 3(output), at time 0.0. 输入参数的数目不足。

前言 从上周开始用S-function做仿真&#xff0c;之前已经学过的&#xff0c;我觉得很好的教程网址是 【0基础直接带你上手matlab simulink仿真&#xff08;不是标题党&#xff0c;讲解超级细致用心&#xff09;&#xff08;非线性系统自适应控制器的搭建&#xff09;】 https…