青年下载站
首页 > 区块链 > 区块链百科 > 

区块链基本概念:什么是智能合约?

作者:佚名 来源:青年下载站 2023-11-21 21:35:53

由于我想构思开课,但又担心学生基础不够,为了方便初学者了解基本概念,我就开了这个《区块链基本概念》系列,不仅讲概念,还讲具体应用,因为我都是在实际项目中使用的,而不只是讲一讲,所以我讲的自然都是重要的,频繁使用的东西。

你如果想要了解某个概念,以及它的应用场景,可以留言。


本文就来讲讲区块链另一个重要概念——智能合约。

智能合约也不是一开始就存在于区块链的,而是V神让它在以太坊区块链中诞生,包括编写智能合约的语言solidity,智能合约的让区块链再次大火,并让区块链的使用门槛更低,应用范围更广


智能合约是什么?

如果你接触过以太坊的话,那你肯定经常接触智能合约:

代币是智能合约:原生代币不算,比如以太坊上的ETH,其他代币都是以智能合约的形式部署在链上的

NFT是智能合约:NFT的大部分数据都存在链上,也有些图片是存在链下的

交易所也是智能合约:去中心化交易所包含的是一系列智能合约,这个太复杂,只能看看之后能不能开个课程讲一讲

还有一些自定义的智能合约,也就是你根据你的应用场景,写了智能合约代码,部署在链上的智能合约,这样的智能合约就是只在你的项目中使用了

代币合约,NFT合约,交易所合约,都是会开源的,也就是公开源代码,主要是为了方便别人去调用使用,也让别人放心,毕竟钱在里面,逻辑透明会更放心。

但是自定义的智能合约,基本不会开源,甚至会特意加密隐藏,因为只有自己使用,另一方面别人知道逻辑后,找到你的漏洞,就可以攻击你。

那怎么定义智能合约呢?

如果我们把区块链当作一个数据库的话,那智能合约你可以把它当DAO层,也就是数据接入层,因为智能合约是定义了一系列数据结构,以及访问这一系列数据结构的接口。

智能合约只能定义一些相对简单的逻辑,如果我们的软件需要更复杂的逻辑的话,还需要智能合约再配合其他访问智能合约的高级语言,比如java,编写更复杂的逻辑才行。

另外,由于区块链的存储空间非常昂贵,所以我们只会在区块链上存储非常关键的东西,比如资产,因为它值得我们费钱去存,所以智能合约目前都是直接跟资产打交道,它的安全尤为重要

我看到在智能合约火起来后,有很多solidity框架相继出现,比如hardhat等等,其实可以不那么依赖框架,本身智能合约也不是多大的工程,Remix部署起来也很简单,写得多错的也容易多,写得多部署的时候花的钱也多。

所以智能合约代码,我认为是越简单越好,写到刚好能解决你的资产存储需求,其他更复杂的逻辑,就放在其他语言里写就好。


什么是智能合约标准(协议)?

智能合约火了以后,还带动一个东西的出现,那就是智能合约标准。

比如代币智能合约ERC20标准,NFT智能合约是ERC721标准。

标准就是针对某一应用场景的一系列接口定义

比如ERC21是为想实现同质化资产(比如货币)在区块链的存储转账,而定义的标准,如果要发行代币,就要实现这个标准;

ERC721是为想实现非同质化资产(比如地契,版权等等)在区块链的存储转账,而定义的标准,如果发行NFT,就会实现这个标准。

为什么要有这些标准?自然是方便接入

比如实现ERC20标准的,它就会实现这几个接口,那么钱包应用就可以通过这几个接口访问这个代币的信息,ERC20公开接口如下:

name:可选,代币名称

symbol:可选,代币符号

decimals:可选,代币精度

totalSupply:代币发行总量

balanceOf(owner):查询指定账户的余额

transfer(to, value):转移指定代币到某个账户

transferFrom(from, to, value):从指定地址,转移指定代币到另一个账户,该操作需要先授权

approve(spender, value):授权指定地址,操作账户的指定代币数量

allowence(owner, spender),查看授权额度

以上接口是必须要求实现的。

因为这些接口是统一的,所以当你把一个代币导入钱包的时候,钱包就可以通过这些统一接口,访问钱包余额,进行转账等等。

如果你天资聪颖,你也可以为某一种应用场景定义自己的标准

比如你想要为游戏的飞行装备定义一系列接口,并取了名字FLYGo:

滑翔(距离)

振翅(高度)

拐弯(角度)

旋转(角度)

这里是我随意举例的,于是有一天,有人觉得你定义的接口非常适合他的场景,于是他选择在他创造的飞行装备中实现你的接口,然后慢慢的,越来越多的人都在他们的飞行装备中实现了你的接口;

一些使用飞行装备的游戏公司,一看你的接口那么多人使用,于是在他的游戏中,也引入了你的接口,并宣传说,本游戏支持所有FLYGo的飞行装备,成功把那些实现FLYGo接口的人引入自己平台;

而其他制作装备的人为了让他的装备在这个游戏中使用,让自己的装备卖给更多人,也相继实现了这个接口。

于是,游戏公司和游戏装备制作者,都约定俗成要去实现这个接口,于是FLYGo就成为一个行业标准;

如果装备不支持这个标准,那么在游戏里面就无法使用,如果游戏不支持这个标准,那这个装备就卖不出去,标准就出现了,后来的人,只要制作飞行装备,就必须要实现你的这个行业标准。


标准之所以称之为标准,是因为很多人去遵守,你定义的标准,如果只在你的小圈子里面遵守,那就只是你的小圈子里的标准,如果能够让全世界去遵守,那就是统一标准。

ERC20,ERC721……这些协议,由于已经业内统一,你只要开发代币就必须必须实现这个协议,否则你的代币哪里都不能使用。


发一个币(部署一个简单的智能合约)

既然讲到了代币协议,那就部署一个代币智能合约吧,简称发币

现在发币非常简单,因为这个协议存在很久了,有很多地方都已经把一系列接口实现标准化了,也不用你写很多。

比如OpenZeeplin公司就有很多现成的库,直接继承它,然后改一改名字和发行量就行。

由于代币大同小异,本文直接使用USDT源码,改了一下名字和发行量,就可以直接发布:

里面实现了ERC20标准的所有接口:

导入remix之后,编译,然后deploy即可:

如果要部署到主网上,就需要连接钱包,花钱包里面的gas费,这里我部署到测试网上,部署完之后,就可以看到合约地址:

 

合约地址在solidity中也是address类型,所以长度也是20字节,和钱包的地址长度一样,所以我们常常会把它跟钱包地址搞混。

合约账户

前面的文章区块链基本概念:什么是钱包?,我们说过,区块链账户有两种,一个是外部账户,也就是钱包,另一个就是合约账户,是的,就是智能合约部署的地址

有了合约地址,我们就可以去区块链浏览器查看,这里我部署到本地测试了所以没法查看,我直接查看一个存在的合约地址,看看有什么,直接复制到搜索框搜索。

可以看到,外部账户有的东西,合约账户也有,比如Overview和Transactions里面的东西,另外,合约账户还有外部账户没有的东西,那就是Token信息,源码信息,Events事件等等。

 

合约账户也有原生代币余额,也有代币余额,也有交易记录。

所以,我们可以往合约账户里面转账,合约账户也可以往外部转账,不过有不同的是,合约账户转账,需要在智能合约里面写相应的接口,通过调用接口的形式转账;而外部账户转账,是通过私钥签名交易,来进行转账的。

任何人,只要知道接口的调用方式(接口名字和参数),都可以调用合约的接口,当然,如果接口在写逻辑的时候限制了调用者身份,那也不可以调用。

所以很多人自己发的自定义合约,是不希望别人知道接口逻辑的,也不希望别人知道接口名和接口参数,否则对方就可以调用,如果代码有漏洞,就可以被对方利用。

但是公开使用的合约,自然是希望别人知道自己的接口怎么使用,就会公开源代码,具体位置在这里:

 

Contract这里有个绿色的对勾,就代表这个合约是开源的,可以在这个选项卡里面直接查看合约源码,也可以调用合约的读和写的接口。

不知道我有没有把智能合约讲明白,不明白的可以评论区留言。

-End-

网友评论
评论:
返回顶部