科普 | 什么是Soilidity?

未知 2021-12-03 16:59:01

data-v-9033 Fe 72数据- v-0 AEA 98aa

什么是Soilidity?

Solidity是一种面向合同的高级编程语言,用于实现智能合约。 索尔蒂亚已经为以太网虚拟机设计了。

Solidity===智能合约。

索尼娅的代码封装在合同里。 合同规定,以太网APP基本构造块——的所有变量和函数都属于一个合同,这是所有项目的起点。

pragma solidity=0.5.0 0.6.0;

合同问候世界

}

上面的代码提供了考虑了我们的代码与b/w 0.5到0.6的哪个版本兼容的版本。 我们又订了一个叫“HelloWorld”的合同。

状态变量和整数

状态变量永久存储在合同存储器中。 这意味着它被写入了以太网区块链。 这些被认为是写入数据库的。

合约样本{2}

//thiswillbestoredpermanentlyintheblockchain

uint myUnsignedInteger=100;

字符串名称=' vivek '

}

Uint数据类型是无符号整数。 那个应该是非负的。

数据类型

值类型:

布尔(真/假)、整数/单位)、地址) )以太网地址的大小)、字符串、枚举

引用类型:

序列、结构和映射

数学运算

附加版: x y

辅助: x—y、

多路复用: x * y

Division: x/y

模块/维修器: x % y (适用于示例,13 % 5 is 3,because if youdivide 5in to 13,3 is the维修器) ) ) ) ) )。

扩展操作单元x=5* * 2; //equal to 5=25

结构

类似于c语言的结构。 如果需要创建具有多个属性的复杂数据类型,请使用结构。

结构人员

uint age;

字符串名称;

数组

的集合称为数组。 有固定数组和动态数组两种。

顾名思义,固定数组有预先定义的大小,而动态数组没有大小。

//arraywithafixedlengthof2elements :

统一阵列;

//注释固定阵列,can contain 5

strings : string [5] string阵列;

//a动态阵列—has无固定大小,can keep growing:

uint [ ]动态阵列;

我们可以把结构和排列组合起来。 创建结构,具有结构数组。 就像面向对象的示例(如Java )中包含对象和对象数组一样。

pragma solidity=0.5.0 0.6.0;

联合工厂{2}

结构强度

字符串名称;

uint roll; 斯托德[ ]公共斯托德; //createsanarraynamedstudentsofstudenttypeobjects

函数声明

功能性记忆库(字符串记忆库名称,uint _amount )公共

函数的可见性是公开的。 有两种方法可以将参数传递给Solidity函数。

根据值和参照

eathamburgers(「vitalik”,100 );

私人/公共函数

在绝对函数中,缺省情况下函数是公共的,因此任何人都可以在网络上调用公共函数。 但是,出于安全原因,我们将函数设置为专用,以便只有所有者才能调用函数。

function _ eat hamburgers (字符串存储器名称,uint _amount )专用性{

}

根据惯例,私有函数的开头有下划线。

内部/外部关键字

函数的可见性有两种类型。 类似于私有,但可以继承的合同访问,即继承除外。

外部像公共。 除了声明这个函数的联系人以外,所有的合同都可以调用这个函数。

在函数中返回

函数声明包含返回值的类型。

功能层(公共视图/纯返回(字符串存储器) {

返回“高”

}

这些函数可以标记为pure/view。 如果连传递的数据都没有访问,则将函数标记为pure。 如果函数只显示数据而不更改数据,则会将其标记为视图。

类型转换

数据类型之间的转换称为类型转换。

uint8 a=5;

uint b=6;

//linebelowthrowsanerrorbecausea *蓝牙,不安装8:

uint8 c=a * b;

//wehavetotypecastbasauint8tomakeitwork :

uint8c=a*uint8(b;

事件

事件用于告诉前端在后端区块链网络上发生了什么事。

//删除事件

事件前端(uintx );

函数(单元y _ x,单元y )公共返回单元) )。

输入结果=_ x _ y;

//fireaneventtoletthefrontendknowthefunctionwascalled

迁移前端(结果);

返回结果;

}

我们的前端代码已经安装了web3,需要拦截“NotifyOnFrontend”事件,以便能够工作。 我们的JavaScript框架和普通JS必须拦截这个事件并接收它:

your contract.notifyonfrontend (函数(错误,结果) {

//do求解与结果

() )

映射

这是存储组织数据(如数组和结构)的另一种方法

映射(地址=单元)公共帐户余额;

这是密钥值存储。 地址是密钥,帐户余额是值。

它可以用于将多个对象(数据)存储在区块链中。 检查例子如下。

示例:

合约样本{2}

结构用户信息

单元age; 字符串数据库;

}

映射(字符串=用户信息)所有用户;

函数组用户信息(字符串名称,uint _age,字符串数据库)公共用户[ _名称].age=_ age; 所有用户[ _名称].DOB=_ DOB; 功能用户信息(字符串名称)公共资源(uint,字符串) )

返回(所有用户[名称].age,所有用户[ _名称].DOB );

}

}

如果setUserInfo现在可以多次调用不同的值,则如下所示:

设定使用者资讯(检视)、26、25/05/1995;设定使用者资讯)、23、01/09/1998 )。

要获取这些值,只需传递名称。

通用信息(vivek ); //26 25/05/1995

通用信息(supu ); //24 01/09/1998

全局变量

这些变量可以用于所有函数,如msg.sender。 我们编写的Solidity程序都应该由所有者调用。 发送者的地址存储在msg.sender全局变量中。

require

require用于验证这两个语句并据此作出决定。 如果条件为true,则代码将成功执行,否则将抛出错误

功能层(字符串存储器名称)公共返回(字符串存储器) /比较if _名称问题

要求(密钥包256 ) ABI .编码打包(名称)==密钥包256 ) ABI .编码打包“欢跃”)

//ifit’strue,经过处理的功能:

返回“嗨! ”;

}

syhi (“欢跃”)//执行成功

sayhi (“供应”)//throws an error

因此,require有助于验证在执行函数之前特定条件必须为真。

继承

在某些情况下,将代码逻辑拆分为多个合同以组织代码比创建非常长的合同更好。

合同动画{2}

功能缓存阶段()公共返回(字符串存储器) )

返回“动画”

}

接触式cat is动画

功能注释者缓存相位()公共返回(字符串存储器) {

返回“cat is动画”

}

}

import

将代码分割为多个文件,然后使用import来使用其他文件的功能。

这通常是在Solidity项目中处理长代码库的方法。

存储和内存

存储是指永久存储在区块链中的变量。 内存变量是临时的,在对合同的外部函数调用之间被删除。 可以认为这是电脑的硬盘和存储器。

与区块链网络中的其他合约交互

关于这一点,我会写单独的文章。 现在请简短:

为了与其他合同进行对话,声明了类似object的接口。 制定了合同,并在其中声明了函数。 我想从别的合同中调用或者使用。 函数是骨架,不包含主体。

合同获取者{2}

函数函数(uint _ num )公共返回(uint ) )。

返回号;

}

如果有合同的话,我想使用上面的getNum函数。 为此,请在项目中创建合同,然后声明getNum函数框架(没有函数体)。

合同编号接口{2}

函数函数(uint _ num )公共返回)单元;

}

现在,您可以从NumberInterface合同中调用getNum函数了。

将合同引入以太坊后,就不能更改了。 也就是说,不能改变。 引入合同的初始代码将永久保留在区块链中。 这就是安全性在Solidity中很重要的原因之一。 如果合同代码有缺陷,以后不能修改。 必须告诉用户开始使用各种具有修复功能的智能合约地址。

函数修饰符

函数修饰符看起来像函数,但使用关键字修饰符而不是关键字函数。 这些是在特殊情况下使用的,例如只希望所有者而不是所有人做些什么。

这有助于更新DApp的重要部分,同时防止其他人破坏我们的合同。 我处理的用例之一是——。 如果想在运行用例之前验证语句。

gas

用户支付gas费用在以太网上执行合同。 gas以以太坊的货币单位计算。 我们函数的总gas成本等于其所有单独操作的总gas成本。

更多关于存储的内容

存储内存将永久写入区块链。 全世界成千上万的节点需要将这些数据存储在硬盘上,随着区块链的增加,这些数据量也会随着时间的推移而增加。 所以这样做是有代价的。

为了降低成本,我们希望避免将数据写入存储,除非绝对必要。 这可能涉及看起来效率低下的编程逻辑——,例如不是简单地在全局存储变量中保存数组并快速查找,而是每次调用函数时在内存中重构数组。

因此,建议尽可能使用内存类型,以确保数据不会永久存储,从而节省成本。 使用Solidity时,循环比使用存储要便宜。 所以,尽可能在for循环中使用内存。 这与Java和Python等语言完全相反,因为for循环的计算成本更高。

For循环

Syntax和Javascript很像。

for(uintI=1; i=10; I () {//主体} )。

应付修饰符

支付功能是让索尔仁和以太坊这么酷的一部分原因——这些都是可以接收以太坊的特殊类型的功能。 在普通的web服务器上调用API函数时,不能一边调用函数一边发送美元——或比特币。

但是,在以太坊,货币(以太坊)、数据)、合同代码本身都在以太坊上,因此可以同时调用一个函数为合同付费。

这允许了一些非常有趣的逻辑,例如为了执行函数合同需要支付一定的费用。

注意:

在以太网上,当在合同上调用函数时,会将其作为事务广播到网络上的一个或多个节点。 节点在网上收集了一些交易,试图成为解决计算量大的数学题的第一个“工作证明”,并将这笔交易和他们的工作证明(PoW )作为一个块在网上的其余部分公开。

代币

因此,基本上令牌是合同,记录了谁有多少令牌以及用于允许这些用户将令牌移动到其他地址的函数。

assert 与 require 的差异

资产类似于请求,如果为假,则抛出错误。 assert和require的区别在于,如果一个函数失败,require会退还用户剩下的gas,但assert不会退还。

Metamask

这是Chrome和Firefox的浏览器扩展,允许用户安全地管理以太坊的帐户和私钥,并使用这些帐户与使用Web3.js的网站进行交互。

应用程序二进制接口。

部署合同后,给以太坊一个固定的地址,永远存在于那里。 在以太网上部署智能合约时,也会生成ABI。 基本上,它是以JSON格式表示的合同方法,教Web3.js如何以我们合同能够理解的方式格式化函数调用。

Web3Js

以太坊的JS前端库被称为web3.js。

来源: https://媒体.com /连接通讯/连接所有实体-其他实体- 45d 709 c4de 77