×

科普 | 什么是Soilidity?_metamask安卓版下载

admin admin 发表于2021-12-03 21:32:05 浏览282 评论0

抢沙发发表评论

什么是Soilidity?


Solidity是一种面向合约的高档编程言语,用于完成智能合约。Solidity现已被规划用于以太坊虚拟机。

Solidity===智能合约。

Solidity的代码封装在合约中。合约是以太坊应用程序的根本构建块——一切变量和函数都归于一个合约,这将是一切项目的起点。

pragma solidity >=0.5.0 <0.6.0; 

contract HelloWorld { 

}

在上面的代码中,咱们供给了考虑到咱们的代码与b/w 0.5到0.6的任何版别兼容的版别。咱们还创立了一个名为“HelloWorld”的合约。


状态变量和整数


状态变量永久存储在合约存储中。这意味着它们被写入以太坊区块链。可以把它们幻想成写入DB。

contract Example { 

// This will be stored permanently in the blockchain 

uint myUnsignedInteger = 100; 

string name = "vivek"

}

Uint数据类型是一个无符号整数。它应该对错负的。


数据类型


值类型:

Boolean(true / false),Integers(int / uint), Address(以太坊地址的巨细),String, enum

引证类型:

数组、结构、映射

数学运算

Addition: x + y 

Subtraction: x — y, 

Multiplication: x * y 

Division: x / y 

Modulus / remainder: x % y (for example, 13 % 5 is 3, because if you divide 5 into 13, 3 is the remainder)

Exponential Operation uint x = 5 ** 2; // equal to 5² = 25


结构


相似于C言语中的struct。当咱们需求创立具有多个特点的杂乱数据类型时,咱们运用结构体。

struct Person { 

uint age; 

string name;


数组


数据的调集称为数组。两种类型:固定数组和动态数组。

望文生义,固定数组有预界说的巨细,而动态数组没有巨细。

// Array with a fixed length of 2 elements: 

uint[2] fixedArray;

// another fixed Array, can contain 5 

strings: string[5] stringArray;

// a dynamic Array — has no fixed size, can keep growing: 

uint[] dynamicArray;

咱们可以组合结构和数组。创立一个结构,然后具有一个结构数组。就像在面向目标典范(如Java)中有一个目标和一个目标数组相同。

pragma solidity >=0.5.0 <0.6.0; 

contract StudentFactory { 

struct student { 

string name; 

uint roll; } student[] public students; // creates an array named students of student type objects


函数声明


function eatHamburgers(string memory _name, uint _amount) public { }

函数的可见性是揭露的。有两种办法可以传递参数给Solidity函数:

按值和按引证

eatHamburgers(“vitalik”, 100);


私家/公共函数


在Solidity中,函数默许是公共的,因而任何人都可以在网络中调用公共函数。可是,出于安全考虑,咱们将函数设为私有,这样只要一切者才干调用函数。

function _eatHamburgers(string memory _name, uint _amount) private { 

}

依照常规,私有函数的最初带有下划线。


内部/外部要害字


还有两种类型的函数可见性。内部相似于私有,除了它可以被承继的合约拜访,即承继。

外部相似于公共。除了声明晰这个函数的联系人之外,一切的合约都可以调用这个函数。


在函数中回来


函数声明包括回来值的类型。

function sayHi() public view/pure returns (string memory) { 

return “Hi”;

}

这些函数可以标记为pure/view。当咱们乃至没有拜访传递的数据时,咱们就将函数标记为pure。假如函数不修正数据,只查看数据,那么它将被标记为view。


类型转化


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

uint8 a = 5; 

uint b = 6;

// line below throws an error because a*b returns a uint, not uint8: 

uint8 c = a * b;

// we have to typecast b as a uint8 to make it work: 

uint8 c = a * uint8(b);


作业


作业用于向前端传达后端区块链网络上发生了一些作业。

// declare the event 

event NotifyOnFrontend(uint x); 

function add(uint _x, uint _y) public returns (uint) { 

uint result = _x + _y; 

//fire an event to let the frontend know the function was called 

emit NotifyOnFrontend(result); 

return result; 

}

咱们的前端代码应该现已安装了web3,而且应该监听“NotifyOnFrontend”作业,这样才干作业。咱们的JavaScript结构或一般JS将不得不监听这个作业来接纳它:

YourContract.NotifyOnFrontend(function(error, result) { 

// do something with result 

})


映射


这是存储有安排数据(如数组和结构)的另一种办法

mmetamask钱包ing (address => uint) public accountBalance;

这是一个键值存储。address是键,accountBalance是值。

这可以用于在区块链中存储多个目标(数据)。查看示例如下:

比方:

contract Example { 

struct UserInfo { 

unit age; string dob;

mmetamask钱包ing(string => UserInfo) allusers;

function setUserInfo(string _name, uint _age, string _dob) public {
allusers[_name].age = _age;
allusers[_name].dob = _dob;
}

function getUserInfo(string name) public view returns(uint, string) { 

return (allusers[name].age, allusers[_name].dob); 

}

现在,假如可以用不同的值屡次调用setUserInfo,比方:

setuserInfo("Vivek",26, 25/05/1995) setuserInfo("Supu", 23, 01/09/1998)

要取得这些值,只需传递称号:

getUserInfo("Vivek"); // 26 25/05/1995 

getuserInfo("Supu"); // 24 01/09/1998


大局变量


这些变量可用于像msg.sender这样的一切函数。咱们所编写的任何Solidity程序,都应该由一切者调用。发送者的地址存储在msg.sender 大局变量中。


require


require用于验证这两个句子,并据此做出决议。假如条件为真,则代码成功运转,不然就抛出过错

function sayHi(string memory name) public returns (string memory) { /Compares if _name equals “Vivek” Throws an error and exits if not true. Solidity doesn’t have native string comparison, so we compare their keccak256 hashes to see if the strings are equaq 

require(keccak256(abi.encodePacked(name)) == keccak256(abi.encodePacked(“Vivek”)));

// If it’s true, proceed with the function: 

return “Hi!”;

sayHi(“Vivek”) // executes successfully 

sayHi(“Supu”) // throws an error

因而,require关于在运转函数之前验证某些条件有必要为真十分有用。


承继


有时候,与其拟定一个十分长的合约,还不如将代码逻辑拆分为多个合约来安排代码。

contract Animal {

function catchphrase() public returns (string memory) { 

return “Animal”;

} contract Cat is Animal {

function anotherCatchphrase() public returns (string memory) { 

return “Cat is an Animal”;

}

}


import


将代码拆分为多个文件,并运用import来运用另一个文件中的功用。

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


存储和内存


存储是指永久存储在区块链上的变量。内存变量是暂时的,在对合约的外部函数调用之间会被删去。可以把它幻想成电脑的硬盘与内存。


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


关于这一点,我将写一篇独自的文章。现在,坚持简略:

为了与其他合约交互,咱们声明晰一个相似object的接口。咱们创立了一个合约,并在里边声明晰一个函数,咱们想要从另一个合约调用或运用它。函数仅仅骨架,它不包括主体。

contract GetNumber { 

function getNum(uint _num) public returns(uint){ 

return _num; 

}

假设有一个合约,咱们想要运用上面的getNum函数。为此,咱们将在项目中创立一个合约,并声明一个getNum函数结构(没有函数体)。

contract NumberInterface { 

function getNum(uint _num) public returns(uint); 

}

现在咱们可以从NumberInterface合约中调用getNum函数。

在将合约布置到以太坊后,它就变成了不可变的,也便是说它不能被修正。布置到合约中的初始代码将永久地停留在区块链上。这便是安全性在Solidity中如此重要的原因之一。假如咱们的合约代码中有一个缺点,就没有办法在今后修补它。有必要珍宝咱们的用户开始运用具有修正功用的不同智能合约地址。


函数修饰符


函数修饰符看起来就像函数,可是运用要害字修饰符而不是要害字函数。这些用于特别情况,例如当您只期望您的一切者而不是一切人做某事时。

这有助于更新DApp的要害部分,一起防止其他用户损坏咱们的合约。我处理过的一个用例是——当咱们想在履行任何用例之前验证句子时。


gas


用户付出gas费来在以太坊网络上运转合约。gas以以太(以太坊上的钱银)为单位核算。咱们的函数的总gas本钱等于它一切独自操作的总gas本钱。


更多关于存储的内容


存储内存被永久写入到区块链中。全世界不计其数的节点需求将这些数据存储在它们的硬盘上,而且跟着区块链的增加,这些数据量也会跟着时刻的推移而增加。所以这样做是有价值的。

为了降低本钱,咱们期望防止将数据写入存储,除非担负必要。有时,这涉及到看似低效的编程逻辑——比方每次调用函数时都要在内存中从头构建数组,而不是简略地将该数组保存在大局存储变量中以便快速查找。

因而,主张尽可能运用内存类型,这样数据就不会永久存储,然后节约本钱。循环在Solidity中将比运用存储更廉价。所以尽可能for 循环中运用内存。这与Java、Python等言语中所做的彻底相反,由于for循环的核算本钱更高。


For循环


Syntax相似于Javascript。

for (uint i = 1; i <= 10; i++) { // body }


敷衍修饰符


付出功用是使Solidity和以太坊如此酷的部分原因——它们是一种可以接纳以太坊的特别类型的功用。当咱们在一个一般的web服务器上调用一个API函数时,咱们不能在调用函数的一起发送美元——也不能发送比特币。

但在以太坊中,由于钱银(以太坊)、数据(买卖有效载荷)和合约代码自身都在以太坊上,所以咱们可以一起调用一个函数并向合约付出费用。

这答应一些十分风趣的逻辑,比方为了履行一个函数,需求向合约付出必定的费用。

留意:

在以太坊中,当咱们在合约上调用一个函数时,咱们将其作为买卖广播到网络上的一个或多个节点。节点在网络上搜集一些买卖,企图成为第一个处理核算密集型数学问题的“作业证明”,然后将这组买卖连同他们的作业证明(PoW)发布为一个块到网络的其余部分。


代币


所以根本上,代币仅仅一个合约,它记录了谁具有多少代币,以及一些函数,以便这些用户可以将他们的代币转移到其他地址。


assert 与 require 的差异


Assert相似于require,假如为false则抛出过错。assert和require之间的区别是,当一个函数失利时,require会交还用户剩下的gas,而assert不会。


Metamask


这是Chrome和Firefox的浏览器扩展,答应用户安全地办理他们的以太坊账户和私钥,并运用这些账户与运用Web3.js的网站进行交互。


应用程序二进制接口。


在布置的合约之后,它会在以太坊上得到一个固定的地址,在那里它将永久存在。在以太坊网络中布置智能合约后,还会生成一个ABI。根本上,它是以JSON格局表明的合约办法,珍宝Web3.js怎么以咱们的合约可以了解的办法格局化函数调用。


Web3Js


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

Source:https://medium.com/coinmonks/learn-all-about-solidity-ethereum-45d709c4de77

韩国政府力挺元宇宙:打造元宇宙城市,出台五年规划

除了企业层面,政府层面也将目光转向了元宇宙