首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

跟我学 Solidity:关于变量

当用作函数参数或在赋值中时,基本数据类型始终按值传递,复杂数据类型(如数组结构体)则按引用传递。 基本数据类型 ?...类型转换:address payable可以隐式转换为简单address类型,这表示你可以将address payable分配给address类型,而无需显式转换。...地址类型成员:[10]地址类型两个重要成员是balance(允许查询地址余额)transfer(允许发送以 wei 单位以太币到address payable类型地址。...,从而可以保存合约所有者地址,msg.value则可以获取发送金额。...本文要结束了,尝试下完成以下作业: 获取合约地址。 获取合约所有者地址。 获取发送地址。 获取合约余额。 获取合约所有者余额(发送者是所有者时)。 获取发送余额。

54720

以太坊智能合约安全开发建议

译文出自:登链翻译计划[1] 译者:六天[2] 校对:Tiny 熊[3] 协议相关建议 以下建议适用于以太坊上任何智能合约开发。...正确使用assert(), require(), revert() assert require函数可以用于参数校验,如果不通过则抛出异常。assert函数应仅用于检查内部错误检查不变量。...注意:需要注意是,payable修饰适用于外部调用。如果在同一个合约中,在 payable 修饰方法中调用未被修饰方法,即使 msg.value 大于 0 也不会出错。...有关安全性继承更多信息,请查看本文。 详见 SWC-125[52] 使用接口类型代替地址以确保安全 当函数将合同地址作为参数时,最好传递接口或合约类型不是地址类型。...可以了解 EVM 基本原理来判断。 过时/历史 建议 以下这些建议由于协议更改或 solidity 版本升级不再相关。在此作记录。

1.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

第十二课 SOLIDITY语法难点解析及故障排查

发送特定数量(wei为单位)以太坊到对应地址,当出现错误时会扔出异常,但不会因异常停止。...【说明】为了非ABI协议合约进行交互,可以使用call() 函数, 它用来向另一个合约发送原始数据,支持任何类型任意数量参数,每个参数会按规则(ABI协议)打包成32字节并一一拼接到一起。...一个例外是:如果第一个参数恰好4个字节,在这种情况下,会被认为根据ABI协议定义函数器指定函数签名直接使用。如果发送消息体,需要避免第一个参数是4个字节。...你仅仅可以访问最近 256 个区块哈希,其余哈希均为零。 6. 错误处理 assert(bool condition): 如果条件不满足就抛出—用于内部错误。...这个原因就是他们被当做所谓预编译合约执行,并且在第一次收到消息后这些合约才真正存在(尽管合约代码是硬代码)。发送到不存在合约消息非常昂贵,所以实际执行会导致 Out-of-Gas 错误

1.1K30

快速学习-Solidity 深入理解

);地址类型也有成员变量,并作为所有合约基础 address payable(v0.5.0引入) 与地址类型基本相同,不过多出了 transfer send 两个成员变量 两者区别转换 Payable...地址是可以发送 ether 地址,普通 address 不能 允许从 payable addressaddress 隐式转换,反过来直接转换是不可能(唯一方法是通过uint160来进行中间转换...) 从0.5.0版本起,合约不再是从地址类型派生而来,但如果它有payable回退函数,那同样可以显式转换为 address 或者 address payable 类型 地址类型成员变量 <address... ether(以Wei为单位),失败时抛出异常,发送 2300 gas 矿工费,不可调节 .send(uint256 amount) returns (bool)...函数assertrequire可用于判断条件,并在不满足条件时抛出异常 assert() 一般只应用于测试内部错误,并检查常量\ require() 应用于确保满足有效条件(如输入或合约状态变量),或验证调用外部合约返回值

1.2K30

智能合约安全审计技术概览

,它还包括两个函数:approveLoan()repayLoan(),其中approveLoan()用于批准贷款,只有贷款人可以调用,repayLoan()用于还款,只有借款人可以调用,当然正式场景下借贷类型智能合约业务功能会更加繁多..."指就是由于没有检查sendcall.value转币函数返回值从而导致合约会继续执行后续代码,还可能由于Ether发送失败导致意外结果,例如下面是一个通过withdraw函数进行提现合约,其中使用了...send函数来进行转账操作,但是由于send函数在转账失败时并不会抛出异常,也不会阻止函数继续执行,因此如果用户在进行体现时如果填入了一个错误地址,那么将会导致用户当前所持资产数量减少,接受代币地址所持资产数量不变...(address _to, uint _amount) public { require(checkAddress(_to)); //执行转账操作 } 通过这种方式在智能合约中进行地址非零检查可以帮助我们避免因为传递了无效地址导致错误安全问题...,这里不做深究,简单列举几项: 参数合法性检查(类型、非空) 函数权限设计(调用者权限) 函数执行条件(各类边界条件) 函数业务逻辑流程(分支判断、循环逻辑) ......

71940

关于DAO社区治理代币挖矿系统开发教程

3.紧急删除图像[仅限所有者]:适用于图像条目。只能由所有者触发。通过投票确认后,目标条目将被删除。投票时间:4小时。单个地址条目的五个删除导致黑名单。...,然后如果提案类型是删除提案且投票结果是肯定,我们使用已经写入删除功能,最后发出了我们添加新事件(将其添加到合约顶部)。...该功能通过为该一个提案中所有投票解锁代币结束。...public { unblacklistAddress(msg.sender);}function unblacklistAddress(address _offender) payable public..._voter) internal view returns (bool) { for (uint256 i = 0; i 请注意,列入黑名单帐户令牌会被锁定,直到他们发送不合格费用为止。

35510

以太坊智能合约设计模式

在处理一个被销毁合约时,有一些需要注意问题: 合约销毁后,发送给该合约交易将失败 任何发送给被销毁合约资金,都将永远丢失 为避免资金损失,应当在发送资金前确保目标合约仍然存在,移除所有对已销毁合约引用...请注意,我们使用自定义ownerRestricted修饰符来显示该方法调用者,即允许合约拥有者 销毁合约。 2、工厂合约 工厂合约用于创建和部署“子”合约。...由于工厂合约资产合约之间唯一联系是变量address[] carAssets,所以一定要正确保存子合约地址。...(name)来获取指定合约地址版本。...假设在这些买方合约中,有一个合约,其开发者在其fallback函数中犯了一个错误,并且在被调用时抛出一个异常,fallback()函数是合约中默认函数,如果将交易发送到合同但没有指定任何方法,将调用合约

1.1K31

chainlink 小实战 web3 “捐助我”项目合约及前端交互——关于 《Patrick web3 course Lesson 7-8 》课程代码中文详解

FundMe lesson 示例 本质上是一个合约上对 eth 接收发送演示,但这个演示增加了前端 ethers 交互,以及对 chainlink 预言机喂价使用。...一、library 解读 我们先从合约块开始讲,毕竟合约可以脱离前端单独存在,也就是一个 api,写好后可以简单进行测试。..., priceFeed 你可以理解为这个类型对象(虽然说我们在传值时候给是地址)。...接着创建了一个可声明后再初始化 immutable 修饰“常量”:address private immutable i_owner;,以及用于记录未提现捐助人、捐赠记录、预言机接口状态变量,如下所示...// payable(msg.sender).transfer(address(this).balance); //调用 call 方法转账提现当前合约全部捐赠 (bool

70242

Solidity 安全:已知攻击方法常见防御模式综合列表

虽然处于起步阶段,但是 Solidity 已被广泛采用,并被用于编译我们今天看到许多以太坊智能合约中字节码。相应地,开发者用户也获得许多严酷教训,例如发现语言和EVM细微差别。...正如我们将看到错误地使用 this.balance 会导致这种类型严重漏洞。 有两种方式可以将 Ether(强制)发送给合约,而无需使用 payable 函数或执行合约中任何代码。...由于所有合法玩家只能发送 0.5 ether 增量,合约收到了 0.1 ether ,合约 this.balance 不再是半个整数。这会阻止 [18]、[21][24] 行所有条件成立。...预防技术 这个漏洞通常是由于错误运用 this.balance 产生。如果可能,合约逻辑应该避免依赖于合约余额的确切值,因为它可以被人为地操纵。...在库合约中, start 用于指定斐波纳契数列起点,它被设置为 0, FibonacciBalance 合约中它被设置为 3。

1.3K30

以太坊合约审计 CheckList 之变量覆盖问题

balanceOf这个函数是来自于token变量 constructor(address addr) payable{ token = ERC20(addr); } token变量是一个全局变量...: 存放部分局部值类型变量,几乎免费使用内存,但有数量限制 全局变量就是存在storage中,合约中全局变量有以下几个 ERC20 public token; uint256[] map; using...map[uint256(msg.sender)+x] = blockNum; 在EVM中数组其他类型不同,因为数组时动态大小,所以数组类型数据计算方式为 address(map_data) = sha...storage指针非常像,要明白这个漏洞,首先我们需要明白在EVM中对变长变量定义储存方式。...mapping,在storage中,people变量储存地址计算公式如下 address(people_data) = sha3(key,slot)+offset 其中key就是mapping类型键名

62420

solidity智能合约经典设计模式

在处理一个被销毁合约时,有一些需要注意问题: 合约销毁后,发送给该合约交易将失败 任何发送给被销毁合约资金,都将永远丢失 为避免资金损失,应当在发送资金前确保目标合约仍然存在,移除所有对已销毁合约引用...请注意,我们使用自定义ownerRestricted修饰符来显示该方法调用者,即允许合约拥有者 销毁合约。 2、工厂合约 工厂合约用于创建和部署“子”合约。...由于工厂合约资产合约之间唯一联系是变量address[] carAssets,所以一定要正确保存子合约地址。...(name)来获取指定合约地址版本。...假设在 这些买方合约中,有一个合约,其开发者在其fallback函数中犯了一个错误,并且在被调用时抛出一个异常, fallback()函数是合约中默认函数,如果将交易发送到合同但没有指定任何方法,将调用合约

1.4K80

Python网络编程-一文厘清socket、TCPUDP那点事

套接字是通过地址簇套接字类型两个主要属性来控制如何发送数据。...、AF_NETLINK、AF_TIPCPython中支持套接字地址家族SO_STREAM、SO_DGRAM套接字类型has_ipv6是否支持IPv6异常error套接字相关错误herror主机地址相关错误...gaierror地址相关错误timeout超时时间方法socket()以给定地址家族、套接字类型和协议类型创业一个套接字对象socketpair()以给定地址家族、套接字类型和协议类型创业一对套接字对象...TCP(Transmission Control Protocol)传输控制协议是一种面向连接、可靠基于字节流传输层通信协议,用于在不可靠互联网络上提供可靠、端对端字节流传输服务。...因此在传送过程中如果数据出错就要由高层协议处理,但也因为没有差错控制流量控制开销,所以使得传输效率高、延时小,适用于对可靠性要求不高应用,可以快速大量发送数据但不负责可靠性,同文章开头表情包,快不快就完事了

1.2K20

Python全栈开发之网络编程

No.2 Socket简介 要解决怎么标识一个进制,在一台电脑上可以同pid标识进程,但是在网络上是做不到,其实TCP/IP就帮我们解决了这个问题,网络层IP可以标识在网络上主机,传输协议+...Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET Type:套接字类型,可以是...if __name__ == "__main__": main() No.9 TCPUDP TCP特点 面向连接,通信双方必须建立连接才能进行数据传输,双方必须为对象分配必要系统资源,TCP...发送每个报文段都必须得到接收方应答才认为传输成功,发送端如果在规定时间内没有收到接收端应答,发送端会将报文段重新发送,TCP还会进行数据校验,还会通过流量控制机制避免主机发送太快让接收端接收不到数据...,完成数据交换后,通信双方必须断开连接,以释放系统资源,这种连接是点对点,因此TCP不适用广播应用程序 UDP特点  UDP并不提供对IP协议可靠机制、流控制以及错误恢复功能等,由于UDP比较简单,

62220

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券