智能合约简单介绍

news2025/1/13 3:16:23

本学期学习了区块链的课程,作业是对于智能合约学习后的报告:

 

1 智能合约简单了解

1.1智能合约是什么

智能合约是由事件驱动的、具有状态的、部署于可共享的分布式数据库上的计算机程序,多用IF-THEN语句。狭义来说,智能合约是设计相关商业逻辑和算法的程序代码,把人、法律和网络的复杂关系代码化;广义来说,智能合约是一种可以实现自我执行和自我验证的计算机协议。乍一看,与数据库中的触发器颇为相似。

简言之,智能合约是一种用计算机语言取代法律语言去记录条款的合约。智能合约可以由一个计算系统自动执行,它可以算是传统合约的数字化版本。

如果把区块链比作一个数据库的话,智能合约就是能够使区块链技术应用到现实生活的应用层。智能合约是在区块链数据库上运行的计算机程序,可以在满足其源代码中写入的条件时自动执行。智能合约编写完毕就可以被用户信赖,合约条款不能更改,因此合约也是不可更改的。

1.2智能合约的技术特点

1.2.1数据透明化

区块链上所有的数据都是公开透明的,因此智能合约的数据处理也是公开透明的,运行时任何一方都可以查看其代码和数据。

1.2.2不可篡改

区块链本身的所有数据不可篡改,因此部署在区块链上的智能合约代码以及运行产生的数据输出也是不可篡改的,运行智能合约的节点不必担心其他节点恶意修改代码与数据。

1.2.3永久运行

支撑区块链网络的节点往往达到数百甚至上千,部分节点的失效并不会导致智能合约的停止,其可靠性理论上接近于永久运行,这样就保证了智能合约能像纸质合同一样每时每刻都有效。

 

2 Solidity语言初步学习

2.1 IDE的使用

在学习过程中使用了在线IDE在本机上该ide截图如下左侧即为文件的列表中间的区域可以快捷新建文件

 

2.第一个智能合约helloworld

2.2.创建项目

新建一个名为Helloworld.sol的文件源码如下相关函数的作用写在了注释里

pragma solidity ^0.4;//版本指令为0.4
contract HelloWorld {//合约创建
function sayHelloWorld() public returns(string){//定义函数,public意味着任何一方 (或其它合约) 都可以调用你合约里的函数。
return ("hello world");
}
}

2.2.2编译运行

在compile选项卡中进行编译,可以点击compilation Details来对编译的具体细节进行了解。这边没有报错,且出现绿色钩子图形表示编译成功。

 在编译成功后,我们就能在run 选项卡中部署该合约

 点击deploy就是部署这个合约,下面就会出现这个合约的函数,点击运行这个合约的函数,日志会输出相应的记录,可见返回了helloworld。

 

 

2.第二个智能合约

对一个简单银行模型的合约进行了学习和编译,对于该模型的理解均以注释的形式写在代码中,通过该合约可以实现存钱,取钱,查看余额的功能:

2.3.1 初始化部分

这边创建了一个银行的简单模型,声明了一个mapping变量来表示余额,进行了一些值和变量的初始化。

2.3.2构造方法

  

2.3.3存钱的方法

2.3.4取钱的方法

2.3.5查看余额的方法

2.3.6对合约进行运行

同helloworld合约一样,编译成功后点击deploy,这边出现了四个方法可以进行选择。

 

我们点击balance和owner分别实现了显示了用户信息和余额的功能,deposit函数也能成功运行,但是withdraw方法却进行了报错,因为这个账户的余额是0,在代码中我们用require函数进行了限制。如果取钱额大于账户余额就会报错,不能实现取款,所以报错。

2.3.7其他

因为这里实现了货币交易,所以会出现收取手续费的提示。gas就是虚拟货币里的手续费的概念,gas越多,交易会越快。

 

 2.3.8 源代码:

pragma solidity 0.6.6;

contract SimpleBank { //创建一个简单银行模型的合约
    
    mapping (address => uint) private balances;//声明了一个mapping类型的变量balance表示余额,这是一个key-value类型,key是address类型,value是uint类型。
//owner用来表示合约持有者的地址。
    address public owner;//address是一种比较特殊的类型,它有20个字节长度,一般用来表示地址或者账户的公钥信息。需要注意的是,虽然看起来它是一个数字的类型,但是它不支持任何的算术运算操作。

    event LogDepositMade(address accountAddress, uint amount);//事件 是合约和区块链通讯的一种机制。你的前端应用“监听”某些事件,并做出反应,通过emit触发事件的执行。

    constructor() public {//构造方法
        owner = msg.sender;//把owner变量赋值为msg.sender,后者是一个约定的内部变量,表示的是方法的调用者。在这里指合约的创建人。
    }


    function deposit() public payable returns (uint) {//deposit表示存钱的方法。被payable关键字修饰的方法可以在调用的时候接收ETH(以太币)。
                                                      //这个方法的首先检查发送的ETH值要必须大于0,然后更新余额,出发日志事件,最后返回余额。
        require((balances[msg.sender] + msg.value) >= balances[msg.sender]);//require使得函数在执行过程中,当不满足某些条件时抛出错误,并停止执行。这边通过该函数判定存入的钱大于0.

        balances[msg.sender] += msg.value;//余额增加

        emit LogDepositMade(msg.sender, msg.value); // 对应上方的event,触发该监听

        return balances[msg.sender];//更新余额
    }


    function withdraw(uint withdrawAmount) public returns (uint remainingBal) {//表示取钱的方法。
        require(withdrawAmount <= balances[msg.sender]);//判定取出的钱小于账户余额。

        
        balances[msg.sender] -= withdrawAmount;//取钱

        msg.sender.transfer(withdrawAmount);//转账一定数量(以wei为单位)的以太币到指定的地址,该地址为调用该函数的人的地址

        return balances[msg.sender];
    }

    function balance() view public returns (uint) {//返回余额的方法。view表示是一个只读的方法,不消耗gas费。
        return balances[msg.sender];
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

函数式编程 | 图文详解 | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘函数式编程 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么应用提出…

70. 利用 ALV 实现增删改查系列之二:仅让 ALV 报表某一列允许被编辑

本系列前一篇文章 69. 利用 ALV 实现增删改查系列之一:让 ALV 报表进入可编辑状态,我们介绍了如何让 SAP ABAP ALV 报表进入可编辑状态。在该状态下,ALV 报表的每一行,每一列都可以被任意修改,如下图所示: 但是在实际的项目中,更常见的需求是,ALV 报表只允许部分列能够…

【Vue脚手架】总结笔记

脚手架文件结构 ├── node_modules ├── public │ ├── favicon.ico: 页签图标 │ └── index.html: 主页面 ├── src │ ├── assets: 存放静态资源 │ │ └── logo.png │ │── component: 存放组件 │ │ └── HelloWorld.vue │ │…

Springboot 整合 ireporter 实践

背景 这段时间&#xff0c;在做项目时&#xff0c;设计到需要带参数的批量生成报告。尝试了很多方法&#xff0c;包括grafana等BI工具。虽然grafana这种BI工具可以在线查看&#xff0c;但是无法导出。甚至当想把报告整合邮件发送时&#xff0c;grafana就显得无能为力了。于是在…

Sql Server 占用内存高,不释放内存问题处理记录(腾讯电脑管家小火箭清内存)

问题&#xff1a; 本人仓库管理系统厂家&#xff0c;项目上反应生产线箱码不能上传到我们系统&#xff0c;我们的WMS软件退出后重新登录也一直登录失败&#xff0c;并且服务器上数据库占用内存过高&#xff0c;SSMS数据库连接不上。 好家伙SQL Server占用了34个G内存。 接口…

前端基础(十二)_overflow属性、clear属性、vertical-align属性

overflow属性 overflow的第一个属性值是x轴方向的属性&#xff0c;第二个值是y周方向的属性 <style>.box1 {width: 150px;height: 50px;等价于下面两个属性/* overflow: hidden auto; */overflow-x: hidden;overflow-y: auto;}</style>1、overflow-x 只包含水平方…

VS2019编译QT6源码

现在QT在线安装只有QT6.2以上的版本和QT5.15&#xff0c;其他版本就需要自己编译&#xff0c;本文讲解在vs2019环境下编译qt6.1.3源码。 1 编译准备 从清华大学镜像站&#xff0c;下载源码&#xff0c;地址如下&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/qt/archive/…

【C++】继承/多态/文件

文章目录一、继承1 继承中的对象模型2 继承中构造和析构顺序3 继承中同名属性和函数处理方式&#xff08;隐藏&#xff09;4 继承同名静态成员属性和函数处理方式5 多继承语法6 菱形继承&#xff08;虚继承&#xff09;二、多态1 多态的原理剖析&#xff08;虚函数表指针&#…

【OpenSourceC#】JEngine框架

前言 一个完全依赖ILRuntime的框架&#xff0c;集成好了ILRuntime和AB资源热更&#xff0c;想用ILRuntime的可以很方便使用。 对着作者的文档JEngine看看框架功能都是怎么实现的。 看下文档中提到的功能如下 JEngine框架核心 热更资源工具 AssetMgr&#xff0c;框架集成…

询盘回复流程及外贸11步流程

询盘回复流程&#xff1a; 从事外贸的新手经常在网上寻找各种各样的外贸干货知识。其实&#xff0c;你不仅要关注某个环节的小细节&#xff0c;还要有“宏观”的思维。分过程、分步骤地梳理外贸工作&#xff0c;是外贸工作中十分重要的一个环节。今天&#xff0c;按照一般的回…

点云中点法向量,点拟合的直线,点拟合的平面

点云中点法向量 计算步骤&#xff1a; 找到点pi相邻点集合S所有点Vi,然后去中心化,并构造协方差矩阵,公式如下: 二维点云该点曲率计算方法&#xff1a; 三维点云该点曲率计算方法&#xff1a; 最小特征值对应的特征向量就是点的法向量 Eigen::Vector2d ComputeNormal(std::v…

m基于BP神经网络的房屋价值变换趋势预测matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 住宅价格是住宅市场的核心&#xff0c;住宅市场的变化关系到广大消费者的切身利益&#xff0c;商品房价格是升是降&#xff0c;销售是冷是旺&#xff0c;是社会关注的热点问题。因此&#xff0c;…

Mybatis-Plus 入门

文章目录0. 前言1. 相关概念1.1 名称介绍1.2 官网特性介绍2. 快速入门2.1 准备工作2.2.1 准备表2.2.2 创建工程2.2 入门测试2.2.1 编写实体类2.2.2 编写Mapper2.2.3 编写测试类3. CRUD3.1 条件构造器3.1.1 AbstractWrapper&#xff08;1&#xff09; 基本比较操作&#xff08;2…

想做数码管显示,单片机IO口资源不够?看看WTV890语音芯片能做些啥

在开发许多产品时许多工程师都会遇到以下问题&#xff0c;如&#xff1a;想驱动4位或10位的LED数码管显示&#xff0c;但是单片机的IO口不够用&#xff1b;要么更换IO口资源更多的MCU来控制&#xff0c;要么更换脚位丰富的单片机&#xff0c;这无疑在MCU上&#xff0c;加了1元左…

在Linux中使用at和crontab命令在指定时间计划任务服务程序

经验丰富的系统运维工程师可以使得Linux在无需人为介入的情况下&#xff0c;在指定的时间段自动启用或停止某些服务或命令&#xff0c;从而实现运维的自动化。尽管我们现在已经有了功能彪悍的脚本程序来执行一些批处理工作&#xff0c;但是&#xff0c;如果仍然需要在每天凌晨两…

2023年电气,电子与信息工程国际会议(ISEEIE 2023)

2023年电气&#xff0c;电子与信息工程国际会议&#xff08;ISEEIE 2023&#xff09; 重要信息 会议网址&#xff1a;www.iseeie.org 会议时间&#xff1a;2023年2月24-26日 召开地点&#xff1a;新加坡 截稿时间&#xff1a;2022年12月31日 录用通知&#xff1a;投稿后2周…

Mac如何做才能彻底清理垃圾

Mac磁盘空间又爆满了&#xff1f;系统运行又卡了&#xff1f;你的Mac需要清理内存缓存垃圾啦&#xff01;本文教会你如何彻底清除Mac垃圾文件&#xff0c;释放存储空间。 现在&#xff0c;Mac电脑最顶配的硬盘可达2TB。这么大的容量&#xff0c;应该够用了吧&#xff1f;可真正…

windowsserver2016安装

vmware安装windowsserver2016: 开始安装OpcServer服务器端&#xff1a; DOM配置过程&#xff1a; 1.设置OpcServer和OpcClient相同的administrator账号和密码 administrator、wong123 2.关闭OpcServer和OpcClient的防火墙 3.开启OpcServer和OpcClient远程桌面访问 4.OpcServe…

玩以太坊链上项目的必备技能(OOP-合约继承-Solidity之旅九)

继承 我们今天不讲别的&#xff0c;就只讲合约继承相关的内容。&#xff08;您是不是感觉这话挺眼熟的&#xff0c;没错&#xff0c;您确实看过&#xff0c;前一篇开头便是今天我们不讲三国&#xff0c;来讲讲 流程控制&#xff0c;您会觉得我上头了还是怎么&#xff01;&…

Java-数据库范式与表关系

数据库范式 数据库范式简介 什么是范式&#xff08;NF NormalForm&#xff09; ● 范式是符合某一种设计要求的总结 在数据库中表的设计&#xff0c;必须保证其合理性 ● 数据库表的设计关系整个系统的架构&#xff0c;关系到后续的开发效率和运行效率 如何设计合理的数据库…