什么是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{?
}
按照惯例,私有函数的开头带有下划线。
内部/外部关键字
还有两种类型的函数可见性。内部类似于私有,除了它可以被继承的合约访问,即继承。
声音 | 上海股交所总经理:区块链想要大规模发展要做好社会科普工作:金色财经报道,上海股交所总经理张云峰表示,区块链当前还处于一个“概念”的阶段,距离成熟应用,影响到百姓的日常生活还有很长的路要走。对于“区块链”和其会带来的社会和经济效果,沈阳应当持审慎的态度。区块链想要大规模发展,一方面要做好这项复杂技术的社会科普工作,加快社会大众对区块链的了解。另一方面,要充分发挥市场的作用,让企业用实实在在的技术创新,赋能实体经济的发展。[2019/11/17]
外部类似于公共。除了声明了这个函数的联系人之外,所有的合约都可以调用这个函数。
在函数中返回
函数声明包含返回值的类型。
functionsayHi()publicview/purereturns(stringmemory){?
return“Hi”;
}
这些函数可以标记为pure/view。当我们甚至没有访问传递的数据时,我们就将函数标记为pure。如果函数不修改数据,只查看数据,那么它将被标记为view。
类型转换
数据类型之间的转换称为类型转换。
uint8a=5;?
uintb=6;
//linebelowthrowsanerrorbecausea*breturnsauint,notuint8:?
uint8c=a*b;
//wehavetotypecastbasauint8tomakeitwork:?
uint8c=a*uint8(b);
事件
事件用于向前端传达后端区块链网络上发生了一些事情。
//declaretheevent?
eventNotifyOnFrontend(uintx);?
functionadd(uint_x,uint_y)publicreturns(uint){?
uintresult=_x+_y;?
//fireaneventtoletthefrontendknowthefunctionwascalled?
动态 | 央行官微旧文重发“再科普”:范一飞详解数字货币:据中国经济网消息,今日,央行官微公众号头条重新发布央行副行长范一飞在2018年1月25日题为《关于央行数字货币的几点考虑》的文章,对央行数字货币再次进行科普。同时,微信公众号第二条发布支付司副司长穆长春8月10日在第三届中国金融四十人伊春论坛上的演讲。近年来,各主要国家和地区央行及货币当局均在对发行央行数字货币开展研究,新加坡央行和瑞典央行等已经开始进行相关试验,人民银行也在组织进行积极探索和研究。[2019/8/21]
emitNotifyOnFrontend(result);?
returnresult;?
}
我们的前端代码应该已经安装了web3,并且应该监听“NotifyOnFrontend”事件,这样才能工作。我们的JavaScript框架或普通JS将不得不监听这个事件来接收它:
YourContract
科普时报:区块链与云计算长期发展目标不谋而合:据《科普时报》今日报道,区块链与云计算两项技术的结合,从宏观上来说,一方面,利用云计算已有的基础服务设施或根据实际需求做相应改变,实现开发应用流程加速,满足未来区块链生态系统中初创企业、学术机构、开源机构、联盟和金融等机构对区块链应用的需求。另一方面,对于云计算来说,“可信、可靠、可控制”被认为是云计算发展必须要翻越的“三座山”,而区块链技术以去中心化、匿名性,以及数据不可篡改为主要特征,与云计算长期发展目标不谋而合。[2018/5/4]
functiongetUserInfo(string?name)publicviewreturns(uint,string){?
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?/?
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。
Source:https://medium.com/coinmonks/learn-all-about-solidity-ethereum-45d709c4de77
标签:INTETUUINRINSint-Truidense Voetbalvereniging Fan Tokencetus币价格UIN价格Bitgrin
据TheBlock消息,11月22日,国际货币基金组织工作人员在一份与中美洲国家的任务有关的结论声明中写道,由于比特币带来的金融和消费者风险,萨尔瓦多不应使用比特币作为法定货币.
1900/1/1 0:00:00据CoinDesk12月7日消息,美国货币监理署发布了2021年秋季的半年度风险展望报告,概述了该机构认为银行应注意的主要风险和新兴风险。OCC周一表示,银行对加密货币的兴趣比以往任何时候都大,但他们需要小心.
1900/1/1 0:00:00原文:北青网 和著名歌手林俊杰做邻居,在现实中很难,在元宇宙中却容易得多。11月23日,林俊杰在推特上展示了他购买的三个虚拟地块,共花费约12.3万美元.
1900/1/1 0:00:00一个由美国两党参议员组成的小组呼吁财政部长珍妮特·耶伦(JanetYellen)澄清由美国总统乔·拜登(JoeBiden)签署成为法律的基础设施法案中有关加密货币纳税申报要求的措辞.
1900/1/1 0:00:00——元宇宙的突然火爆引发了大众的参与和学习,于是我准备从宏观角度出发,逐步为大家分享关于这方面的内容。人们当下所追逐的浪潮,未必是元宇宙真正的形态.
1900/1/1 0:00:00据Cointelegraph消息,根据最新消息,如果陪审员们继续僵持下去,“Kleiman诉CSW一案”可能会以无效审判告终。CSW声称,他在发明比特币时使用了中本聪这个假名.
1900/1/1 0:00:00