DAPP泰山众筹系统搭建开发智能合约技术

简介: 链上所有的应用程序(dApp)也都是由智能合约驱动的,不论是借贷协议、去中心化交易所(DEX)、预言机或NFT市场。这些协议都是由一个或多个智能合约组成的,而合约里面都会写好各式功能,让协议能正常被用户使用。

  智能合约(smart contract)其实不智能,也不是一个合约。它是在链上运行的一段程序代码,而这段程序代码运行着一套开发者写好的规则或准则,所以类似于合约有着对签约双方的规定一样。

  写好的合约被部署到链上之后,也会以一个地址的形式被表示(和钱包一样),而不同的钱包也都能对这个合约发送交易。在Etherscan等Explorer上我们也能查讯到这个合约的程序代码、看到哪些地址跟合约互动等等。

  智能合约运行着一套开发者写好的规则,那这些规则有什么应用呢?最基本的就是用来发行代币,只要是应用代币或是NFT就都是由合约产生的,但原生代币没有智能合约。这就是$WETH和$ETH的不同,$WETH和其他代币一样属于基于智能合约的代币,而$ETH则是以太坊的原生代币。不论是哪种代币都能在合约里面定义这代币符合的规则,(例如以太坊的ERC-20、ERC-721、ERC-1155)它的供给量、代币的代号(symbol)等等。

  链上所有的应用程序(dApp)也都是由智能合约驱动的,不论是借贷协议、去中心化交易所(DEX)、预言机或NFT市场。这些协议都是由一个或多个智能合约组成的,而合约里面都会写好各式功能,让协议能正常被用户使用。例如我们刚刚举例的“Swap Exact Tokens for Tokens”功能,就能在下图合约上看到当用户地址呼叫这个功能时,合约会做什么相对应的操作。

  智能合约与链的互动

  写智能合约的语言有很多中,每一条链支援的语言也不太一样,常见的语言有Solidity,Vyper和Rust。在链上执行合约的环境称为虚拟机器(VM),不同的链也有各自不同的环境(例如以太坊的就称为EVM),而这些环境能适用的程序语言也不同。像是以太坊的EVM就只能执行由Solidity写的智能合约,这也让Solidity成为现在最普遍的智能合约语言。

  EVM-compatible链指的就是这些链的执行环境与以太坊的EVM是兼容的,这也代表这些链所适用的语言大都是Solidity。加上智能合约大都是开源的,所以只要是EVM-compatible的链都有很多从以太坊复制(fork)上去的协议,这些协议的智能合约大多都没有更动,主要是更改协议名称以及网页介面而已。下图可以看到Uniswap就被复制了252次,Compound、Olympus DAO等以太坊上的知名项目也有很多复制品。这也让EVM-compatible的链能快速的复制成功的协议,并形成丰富的生态,但也因而较缺乏创新的协议。比较知名的EVM-compatible链有Polygon、币安链、Avalanche,non-EVM-compatible的链则有Solana、Terra等。

  Solidity中很多方法都很底层,比如开发中很常见的迭代和判断字符串相等的方法都没有,必须要自己写个方法来实现。可能已有些库已实现类似的方法,不过总归是要麻烦不少。相比起来,JavaScript自己就带了很多原生的方法,用起来也很顺手。

  判读字符串相等不能直接使用==这样的方法,我也搞不清为什么,很多语言都是直接支持的,只有Solidity不支持。没办法,只能自己设计个方法来实现。

  function compareStr(string _str1,string _str2)public returns(bool){

  if(keccak256(abi.encodePacked(_str1))==keccak256(abi.encodePacked(_str2))){

  //如果二者相等,使checkResult为true

  checkResult=true;

  }else{

  checkResult=false;

  }

  //返回checkResult

  return checkResult;

  }

  对两个字符串进行哈希运算,结果一致就证明两个字符串相等。这个哈希运算有点费时,可以在这之前做个长度判断以节约点时间,达到一个平衡。改进后的方法:

  function compareStr(string _str1,string _str2)public returns(bool){

  if(bytes(_str1).length==bytes(_str2).length){

  if(keccak256(abi.encodePacked(_str1))==keccak256(abi.encodePacked(_str2))){

  retrun true;

  }

  }

  return false;

  }

  如果是频繁地运用这个方法,或者是对很多的字符串组进行比较,则改进后的方法会优良不少。

相关文章
|
存储 对象存储 UED
CDN适用哪些场景?
CDN是将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。今天为大家分享几个CDN的典型适用场景。
16818 0
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
4566 8
|
Shell Docker 容器
|
数据可视化 Linux 网络安全
【Linux】虚拟机安装Linux、客户端工具,MobaXterm的使用,Linux常用命令
【Linux】虚拟机安装Linux、客户端工具,MobaXterm的使用,Linux常用命令
785 0
|
人工智能 Oracle 大数据
31%和187%,神州数码找到云转型路径
31%和187%,神州数码找到云转型路径
480 0
31%和187%,神州数码找到云转型路径
|
Web App开发 运维 监控
应用运维——《应用智能运维实践(试读版)》
应用运维保障是软件全生命周期管理过程中的关键环节。软件系统开发上线后,要达到预期的设计目标、稳定服务于目标场景,全靠运维保障支撑。
应用运维——《应用智能运维实践(试读版)》
|
云安全 弹性计算 安全
阿里云ecs实例如何添加IP白名单和安全组?
现在使用一些网络产品都会因为各种原因需要添加它们的 IP 到服务器白名单中,比如 360 网站卫士就需要将它们的 IP 段添加到我们的阿里云服务器的防火墙白名单中,要不然很有可能会被拦截从而出现 502 错误,所以今天我们就来说一说阿里云 ECS 服务器如何添加 IP 白名单和安全组。
9791 0
|
数据安全/隐私保护
手把手教你域名代续费的操作步骤
域名代续费是指通过A账号为B账号下的域名进行续费。本文为您介绍域名代续费的适用场景,以及域名代续费的使用限制和操作流程。
3844 0
|
运维 安全 前端开发
我在蚂蚁金服做SRE
有一种误解流传甚广,认为技术风险工程师是一个“背锅”的岗位,干着脏活累活……事实真的如此吗?蚂蚁金服技术风险部的孝泰同学以他的亲身经历来“辟谣”,并广发英雄帖——蚂蚁金服春季校招启动,欢迎同学们加入技术风险部感受不一样的风景,毕竟,做好几万台服务器的发布这种事儿还是非常牛x的。
14519 0
|
监控 算法 物联网
基于工业物联网的工业机器人PHM架构
为了避免由于故障造成的停产损失,需要在工业机器人的健康管理方面引入了预测分析模型。本文根据既有文献描述的两种典型基于“控制层感知和分析”的方法,给出了一种基于工业物联网的工业机器人PHM架构。
5591 1