木星链 木星链
Ctrl+D收藏木星链

RIN:解析Soilidity:用于实现智能合约的高级编程语言

作者:

时间:1900/1/1 0:00:00

原文标题:《LearnallaboutSolidityEthereum》

作者:VivekSingh

翻译:去中心化金融社区

什么是Soilidity?

Solidity是一种面向合约的高级编程语言,用于实现智能合约。Solidity已经被设计用于以太坊虚拟机。

Solidity===智能合约。

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

pragmasolidity>=0

studentpublicstudents;//createsanarraynamedstudentsofstudenttypeobjects

函数声明

functioneatHamburgers(stringmemory_name,uint_amount)public{}

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

按值和按引用

eatHamburgers(“vitalik”,100);

私人/公共函数

在Solidity中,函数默认是公共的,因此任何人都可以在网络中调用公共函数。然而,出于安全考虑,我们将函数设为私有,这样只有所有者才能调用函数。

function_eatHamburgers(stringmemory_name,uint_amount)private{?

}

按照惯例,私有函数的开头带有下划线。

纽约梅隆银行的加密货币托管业务违反了SEC规则:金色财经报道,纽约梅隆银行(BNY Mellon)进军数字资产托管业务遇到了监管障碍。美国证券交易委员会(SEC)第121号员工会计公告(SAB121)要求数字资产托管人将这些资产记录在其资产负债表上。这一监管要求对寻求扩大数字资产托管业务的银行,尤其是纽约梅隆银行等专门从事信托服务的银行来说,构成了潜在的障碍。纽约梅隆银行于2022年10月开始开展数字资产托管业务。然而,直到该银行在建立加密托管业务方面取得重大进展后,才发现SAB121监管障碍。[2023/7/1 22:11:18]

内部/外部关键字

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

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

在函数中返回

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

functionsayHi()publicview/purereturns(stringmemory){?

return“Hi”;

}

这些函数可以标记为pure/view。当我们甚至没有访问传递的数据时,我们就将函数标记为pure。如果函数不修改数据,只查看数据,那么它将被标记为view。

类型转换

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

uint8a=5;?

uintb=6;

//linebelowthrowsanerrorbecausea*breturnsauint,notuint8:?

uint8c=a*b;

//wehavetotypecastbasauint8tomakeitwork:?

Signature Bank联创、总裁兼CEO计划在2023年转型为高级顾问:金色财经报道,加密友好银行 Signature Bank 宣布,联合创始人、总裁兼 CEO Joseph J. Depaolo 计划在 2023 年转型为高级顾问,首席运营官 Eric R. Howell 将自 3 月 1 日起接替 Depaolo 担任总裁,并继续担任首席运营官和董事会成员。Depaolo 保留 CEO 职位,并继续留在银行董事会中。在 Depaolo 完成高级顾问的转型后,Howell 届时将被任命为新任 CEO。[2023/2/16 12:11:10]

uint8c=a*uint8(b);

事件

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

//declaretheevent?

eventNotifyOnFrontend(uintx);?

functionadd(uint_x,uint_y)publicreturns(uint){?

?uintresult=_x+_y;?

//fireaneventtoletthefrontendknowthefunctionwascalled?

?emitNotifyOnFrontend(result);?

?returnresult;?

}

我们的前端代码应该已经安装了web3,并且应该监听“NotifyOnFrontend”事件,这样才能工作。我们的JavaScript框架或普通JS将不得不监听这个事件来接收它:

YourContract.NotifyOnFrontend(function(error,result){?

SEC指控两家加密公司拉高抛售加密货币:10月2日消息,美国证券交易委员会(SEC)指控百慕大公司Arbitrade和加拿大公司Cryptobontix及其负责人通过一种名为“Dignity”或“DIG”的加密货币进行“拉高抛售”(Pump-And-Dump)。

SEC在指控中指出,这两家公司通过发布虚假公告,出售了至少3680万美元的 DIG。[2022/10/2 18:37:43]

//dosomethingwithresult?

})

映射

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

mapping(address=>uint)publicaccountBalance;

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

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

例子:

contractExample{?

??structUserInfo{?

?????unitage;stringdob;

}?

??mapping(string=>UserInfo)allusers;

functionsetUserInfo(string_name,uint_age,string_dob)public{

allusers.age=_age;

allusers.dob=_dob;

}

functiongetUserInfo(string?name)publicviewreturns(uint,string){?

数据:比特币全网算力上周首次突破260E:9月11日消息,据bitinfocharts数据显示,比特币全网算力于上周9月4日首次突破260E,并创下了264.8047E的迄今最高算力值。当前比特币全网算力约为245.908 Ehash/s,过去24小时上涨10.31%。[2022/9/11 13:22:46]

???return(allusers.age,allusers.dob);?

?}?

}

现在,如果可以用不同的值多次调用setUserInfo,比如:

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

要获得这些值,只需传递名称:

getUserInfo("Vivek");//2625/05/1995?

getuserInfo("Supu");//2401/09/1998

全局变量

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

require

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

functionsayHi(stringmemory?name)publicreturns(stringmemory){/Comparesif_nameequals“Vivek”Throwsanerrorandexitsifnottrue.Soliditydoesn’thavenativestringcomparison,sowecomparetheirkeccak256hashestoseeifthestringsareequaq?/?

Web3游戏工作室CLUB完成310万美元种子轮融资,Zee Prime Capital领投:金色财经消息,Web3游戏工作室CLUB宣布完成310万美元种子轮融资,Zee Prime Capital领投,ATKA、Merit Circle、CitizenX、Moonlanding Ventures、Petrock Capital以及几位专注于GameFi、足球和媒体的知名天使投资人参投。CLUB计划利用新融资进一步开发其首款游戏,包括构建市场,建立社区,并扩大其团队。与社区的游戏开发将在2022年第三季度开始。

CLUB正在开发P2E足球游戏“CLUB Game”,旨在引入Web3数字所有权来增强游戏体验。该游戏目前处于早期测试阶段,目前已有超过25000名注册用户。CLUB计划在整个2022/23年扩大测试。(Alexa Blockchain)[2022/7/16 2:16:57]

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

//Ifit’strue,proceedwiththefunction:?

return“Hi!”;

}?

sayHi(“Vivek”)//executessuccessfully?

sayHi(“Supu”)//throwsanerror

因此,require对于在运行函数之前验证某些条件必须为真非常有用。

继承

有时候,与其制定一个非常长的合约,还不如将代码逻辑拆分为多个合约来组织代码。

contractAnimal{

??functioncatchphrase()publicreturns(stringmemory){?

???return“Animal”;

?}?

}contractCatisAnimal{

??functionanotherCatchphrase()publicreturns(stringmemory){?

???return“CatisanAnimal”;

}

}

import

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

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

存储和内存

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

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

关于这一点,我将写一篇单独的文章。现在,保持简短:

为了与其他合约交互,我们声明了一个类似object的接口。我们创建了一个合约,并在里面声明了一个函数,我们想要从另一个合约调用或使用它。函数只是骨架,它不包含主体。

contractGetNumber{?

??functiongetNum(uint_num)publicreturns(uint){?

???return_num;?

}

假设有一个合约,我们想要使用上面的getNum函数。为此,我们将在项目中创建一个合约,并声明一个getNum函数框架(没有函数体)。

contractNumberInterface{?

?functiongetNum(uint_num)publicreturns(uint);?

}

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

在将合约部署到以太坊后,它就变成了不可变的,也就是说它不能被修改。部署到合约中的初始代码将永久地停留在区块链上。这就是安全性在Solidity中如此重要的原因之一。如果我们的合约代码中有一个缺陷,就没有办法在以后修补它。必须告诉我们的用户开始使用具有修复功能的不同智能合约地址。

函数修饰符

函数修饰符看起来就像函数,但是使用关键字修饰符而不是关键字函数。这些用于特殊情况,例如当您只希望您的所有者而不是所有人做某事时。

这有助于更新DApp的关键部分,同时防止其他用户破坏我们的合约。我处理过的一个用例是——当我们想在执行任何用例之前验证语句时。

gas

用户支付gas费来在以太坊网络上运行合约。gas以以太(以太坊上的货币)为单位计算。我们的函数的总gas成本等于它所有单独操作的总gas成本。

更多关于存储的内容

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

为了降低成本,我们希望避免将数据写入存储,除非绝对必要。有时,这涉及到看似低效的编程逻辑——比如每次调用函数时都要在内存中重新构建数组,而不是简单地将该数组保存在全局存储变量中以便快速查找。

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

For循环

Syntax类似于Javascript。

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

应付修饰符

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

但在以太坊中,因为货币(以太坊)、数据(交易有效载荷)和合约代码本身都在以太坊上,所以我们可以同时调用一个函数并向合约支付费用。

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

注意:

在以太坊中,当我们在合约上调用一个函数时,我们将其作为交易广播到网络上的一个或多个节点。节点在网络上收集一些交易,试图成为第一个解决计算密集型数学问题的“工作证明”,然后将这组交易连同他们的工作证明发布为一个块到网络的其余部分。

代币

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

assert与require的差异

Assert类似于require,如果为false则抛出错误。assert和require之间的区别是,当一个函数失败时,require会退还用户剩余的gas,而assert不会。

Metamask

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

应用程序二进制接口。

在部署的合约之后,它会在以太坊上得到一个固定的地址,在那里它将永远存在。在以太坊网络中部署智能合约后,还会生成一个ABI。基本上,它是以JSON格式表示的合约方法,告诉Web3.js如何以我们的合约能够理解的方式格式化函数调用。

Web3Js

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

标签:RININTETUUINring币能涨起来吗blockchaintechnologycetus币项目方BabyPenguins

芝麻开门交易所下载热门资讯
THE:三元×Element.black实录

感谢大家关注三元社区最新一期的AMA,今晚我们有幸请来Element.Black的执行总监MarkRau先生欢迎!感谢:Odaily星球日报、金色财经、火星财经、PANews、Tokenview.

1900/1/1 0:00:00
USDC:上海数据交易所正式揭牌成立 盘古开源积极参与布局数据存储领域

2021年11月25日,上海数据交易所正式揭牌成立,当天完成挂牌数据产品20个,涉及金融、交通、通信等八大类,国家电网、京东等多家企业展开数据交易布局.

1900/1/1 0:00:00
FAF:全力打造行业标杆,FAF主办区块链大会再掀新浪潮

纵观行业十年发展,区块链领域向来不乏佼佼者。但如果提到“实力”与“技术”并存的领头羊,FAF一定榜上有名.

1900/1/1 0:00:00
DAO:12月加密板块轮动将会挪向何方? L2 和 DAO 或成最大看点

来源:Medium作者:AnnInw编译:ChenZou以太坊L2解决方案Metaverse?元宇宙已经爆火过了,公链赛道竞争的热度也逐渐褪去.

1900/1/1 0:00:00
加密货币:币圈开始借“奥密克戎”割韭菜 连彭博社都看不下去了...

新冠病“迄今为止最凶猛”的变种奥密克戎让全球各国风声鹤唳之际,一些币圈分子却从中嗅到了“商机”.

1900/1/1 0:00:00
DAO:风投Variant Fund联合创始人:DAO是工人运动的下一阶段

原标题|VariantFund联创:DAO是工人运动的下一阶段作者|LiJin,VariantFund联合创始人编译:0x22D.

1900/1/1 0:00:00