由于我想构思开课,但又担心学生基础不够,为了方便初学者了解基本概念,我就开了这个《区块链基本概念》系列,不仅讲概念,还讲具体应用,因为我都是在实际项目中使用的,而不只是讲一讲,所以我讲的自然都是重要的,频繁使用的东西。
你如果想要了解某个概念,以及它的应用场景,可以留言。
本文就来讲讲区块链另一个重要概念——智能合约。
智能合约也不是一开始就存在于区块链的,而是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-
- 上一篇:比特币又火了?BRC20是什么?
- 下一篇: 比特币的机构投资额逾10亿美元
- 《Battle Gang》:超能萌宠,团队欢乐竞技新体验!
- 最新版本iPhoneSE将在2025年3月发布 依然搭载苹果5G调制解调器
- Bungie射击新作《Marathon》上架Steam页面
- 《Save Your Nuts》:坚果保卫战,智斗与趣味的碰撞
- Google Play 上架审核标准又收紧,换种解题思路行不行?
- 《糖豆人》与《星球大战》联动,4款IP皮肤上线
- 第一个高速6G原型设备推出 可达到100Gbps速度
- 苹果2024首场发布会时间将为“35分钟左右”?
- iPhone16会有全新的“沙漠钛色”和“钛灰色”选择
- 新版iPadmini要来了 苹果5月7日即将举行新品活动
- 苹果再次和OpenAI进行谈判后者提供人工智能技术给iPhone等产品
- 苹果推出的12.9英寸iPad Air将采用LCD屏