智能合约
文章平均质量分 66
主要分享区块链各大公链智能合约相关技术,
技术咨询
北纬32.6
这个作者很懒,什么都没留下…
展开
-
Uniswap 解析:恒定乘积做市商模型Constant Product Market Maker Model 的Vyper 实作
Dai -> Ether:用2 Dai 来购买Ether,依照上方公式(1-x)(50+2) = 50 可得x ≒ 0.038,也就是说得到的价格是2 Dai = 0.038 Ether,高于市价2 Dai = 0.02 Ether,那么眼尖的人就会立刻冲来套利了xD。在有手续费的情况下∆x 就变成了(1-ρ)∆x ,若令γ = 1-ρ 则为γ∆x。要注入多少Ether (≥ 10¹⁰) (= x) 以及相应的币的数量(= y),也就是上方提到的k 值(= x* y),在本例的X 币就是Ether。原创 2023-01-31 14:59:56 · 2360 阅读 · 0 评论 -
solidity智能合约之将函数调用记录为事件
将在使用区块链客户端可查询的索引字段调用时记录此信息。这涵盖了事件的大多数用例,使它成为一种快速将事件日志记录添加到 dapp 的简单方法。修饰符提供通用函数调用日志记录,该修饰符触发数据捕获作为。将函数调用记录为事件。使用修饰符修饰的函数。原创 2023-01-24 14:04:28 · 233 阅读 · 0 评论 -
数学魔法结局:muldiv
这条指令完全符合我们的要求,只是它返回的是余数而不是商。那么我们的策略是什么?介绍了一些棘手的数学魔法,但我一直没有抽出时间说出妙语。我们的秘密武器是 EVM 的。中,它可以在每笔交易中节省 gas。独立地将各个部分拼凑起来并提出了相同的策略。这个例程包含在 Uniswap V3。上述的一个早期变体被简要地考虑包含在。原创 2023-01-21 16:20:25 · 1196 阅读 · 0 评论 -
Solidity 中的数学(第 5 部分:指数和对数
二进制定点数和浮点数的区别在于,对于定点数,指数是预定义的常量,通常为负数,因此只需要存储尾数;在本文中,我们将展示如何在 Solidity 中有效地实现以 2 为底的对数和指数函数,如何将这些以 2 为底的函数转换为相应的自然(以。对数函数连同指数函数(指数函数是对数函数的倒数)允许将乘法转换为加法,更重要的是,可以将求幂转换为乘法。因此,计算二进制对数的小数部分可以推导为计算 1(含)和 2(不含)之间数字的二进制对数。因此,二进制定点数或浮点数的二进制对数可以计算为尾数加上指数的二进制对数。原创 2023-01-20 15:10:19 · 2143 阅读 · 0 评论 -
Solidity 中的数学(第 4 部分:复利)
其次,必须在每期末计算复利,即使在接下来的时间段内没有人会使用更新后的本金。第四,对于短时间,这种方法是不准确的,因为交易挖掘时间不可预测,并且在网络负载高的时候可能会非常大。如果时间段很短,或者上一次复利是很久以前进行的,那么在所有经过的时间段内复利所需的气体量可能会超过区块气体限制,从而有效地使进一步的复利变得不可能。在我们的下一篇文章中,我们将介绍提供大致相同精度的更便宜的方法。由于缺乏本机分数支持,复杂的分数计算,例如复合定期利率所需的那些,在 Solidity 中可能具有挑战性。原创 2023-01-20 14:21:23 · 2306 阅读 · 0 评论 -
Solidity 中的数学(第 3 部分:百分比和比例)
我们可以通过一对两个 256 位无符号整数分别持有整个 512 位数字的低位和高位 256 位部分来模拟 Solidity 中的 512 位无符号整数。在上一篇文章中,我们展示了如何以精度为代价解决幻象溢出问题,但是该解决方案在这里不起作用,因为我们需要精确的结果。在主流编程语言中简单明了,在 Solidity 中,这种简单的计算具有惊人的挑战性,正如我们在。operators,而真正的代码应该使用SafeMath函数来防止真正的,即非幻象的溢出。是一个函数,它返回参数最高有效位的从零开始的索引。原创 2023-01-18 19:52:38 · 1178 阅读 · 0 评论 -
Solidity 中的数学(第 2 部分:溢出)
我需要几秒钟来写这四个字,在这几秒钟内,我观察附近的行,试图找出原因,为什么不可能溢出,或者为什么在这种特殊情况下应该允许溢出。智能合约必须是安全的。在那些整数类型确实会溢出的语言中,纯整数主要用于索引、计数器和缓冲区大小,即用于受正在处理的数据大小限制的值。唯一变得更安全的操作是除法:除以零以前返回零,但现在它抛出异常,但即使是除法也没有变得完全安全,因为它仍然可能溢出。因此,一旦 EVM 拥有算术操作码版本,在溢出时恢复,它们的 gas 成本可以与现有的不安全版本相同,或者略高。是溢出时跳转的地址。原创 2023-01-18 17:01:03 · 1287 阅读 · 0 评论 -
Solidity 中的数学(第 1 部分:数字)
定点数基本上是一个简单的分数,其分母是一个预定义的常数,通常是 2 或 10 的幂。然而,一旦以太坊中的大多数数字都是 256 位宽,那么即使简单的两个数相加也可能有 257 位宽,而两个数的乘积可能高达 512 位宽。一个数可能是整数或非整数,有理数或无理数,正数或负数,实数或虚数等,但这些只是属性,数字可能有也可能没有,单个数字可能同时具有多个这样的属性。在运行时,Solidity 循环中的除法结果趋向于零,其他算术运算在溢出时回绕,而在编译时,使用具有任意大分子和分母的简单分数计算表达式。原创 2023-01-18 16:28:46 · 1914 阅读 · 0 评论 -
如何从区块链上数据识别出套利行为或者抢跑三明治交易
鉴于交易可以任意复杂并且可以有无数未知交易模式,使用特定交易模式匹配的方法无法应对新的 MEV 模式。为了确定交易中是否发生套利,我们需要对交易进行通用抽象。· TransferTable的每一行表示一个Address的一个Asset发生了变化,正值表示增加,负值表示减少。· 在同一个区块中,攻击者的交易包含一个开始交易、一个结束交易,以及介于两者之间的一个或多个受害者交易。我们用它来描述一次交易中所有涉及的地址之间发生的多个资产流的最终结果。· 交易中涉及的每项资产在各自的交易中都经历了流入和流出。原创 2023-01-09 00:56:08 · 1229 阅读 · 0 评论 -
巧妙来验证调用者是普通帐户而不是合约账户
如何判断是普通地址还是合约地址原创 2023-01-07 18:43:41 · 139 阅读 · 0 评论 -
构建 ERC20 代币合约
就像 Ether 和大多数正在使用的 ERC20 代币合约一样,除非您有非常特殊的理由不这样做。使用 Contracts,我们可以轻松创建我们自己的 ERC20 代币合约,该合约将用于跟踪假设游戏中的内部货币。合约内部的所有运算仍然是对整数进行的,而且是不同的用户界面(钱包、交易所等)必须根据 调整显示的值。不幸的是,Solidity 和 EVM 不支持这种行为:只能使用整数(整数),这会带来问题。此外,我们正在创建一个of 令牌,它将被分配到部署合约的地址。这就是我们的 GLD 代币的样子。原创 2022-12-29 13:55:51 · 1394 阅读 · 2 评论 -
AMM 套利者
那么,在野外运行的机器人太多了,尤其是在 ETH 和 BSC 中。而且它使用 flashswap,所以你只需要很少的钱(只是一些 gas 费用)来运行它。一旦相同代币对的价格在不同的 AMM 上出现差异,我们就可以在这些 AMM 之间进行套利。如果您的 TypeScipt 版本高于 4.4.x,您可能会遇到此错误。当导数函数为0时,函数有一个最大值/最小值,我们可以设置一些条件来忽略最小值处的解。以获得令牌对之间可能的利润。原创 2022-11-21 13:29:51 · 740 阅读 · 0 评论 -
查询或解析solidity智能合约事件event或logs日志
我们经常会遇到查询或访问某个合约的历史log日志,并解析合约地址相关日志,当然也可以是某个用户的地址。通过web3js获取此token合约的转账事件,并解析此token合约对应的日志。这是一个token合约,我们将获取此token合约的所有转账事件的历史记录。这是要解析的日志log,下面emit 后面的代码。这里提供了三种直接访问的方案(其它方案这里不阐述)一个Promise对象,其解析值为历史事件对象数组。以上链接是源码链接地址;这是event事件代码。分别是:1:once。读取合约的历史事件。...原创 2022-08-27 14:03:58 · 2051 阅读 · 1 评论 -
Solidity中将address转换为address payable的方法
在solidity中直接通过address调用转账方法,偶尔会出现“Type address is not implicitly convertible to expected type address payable”,这时有两种方法可解决(以msg.sender为普通地址举例):转载 2022-08-18 10:17:52 · 613 阅读 · 0 评论 -
如何使用standard-input-json验证Solidity源码?
打开artifacts\build-info路径下的json文件。打开artifacts\build-info路径下的json文件。content内容:将solidity源码转换为JSON字符串。(特别提醒,只要input字段里面的内容,其它的不要)(特别提醒,只要input字段里面的内容,其它的不要)将solidity源码转换为JSON字符串。...原创 2022-08-12 14:09:21 · 321 阅读 · 0 评论 -
从不同智能合约访问合约内的mapping
我们在写合约的时候,经常会遇到,一个solidity智能合约访问另一个智能合约的mapping数据,这里有两种方案。② 第二种方案就是在被访问合约中写读取mapping里面数据的方法,然后在访问者合约写interface接口。①第一种方案如下面代码。...原创 2022-08-10 23:15:31 · 523 阅读 · 0 评论 -
silidity经典智能合约(三)
写在前面(及代码解读)1:系统初始化有86400000000个鸡蛋;2:项目方怎么挣钱 1):3%的交易费进入项目的地址: 2)默认推荐人地址,如果有新玩家假如,那么他每次买卖鸡蛋的时候,推荐者都会收到3%鸡蛋;3: 对于累计的鸡蛋,玩家可以选择卖掉换成BNB,或者按照864000的比例转换成一只鸡;4:把鸡蛋孵化成鸡的过程,会增加市场上鸡蛋的数量,增加消耗掉的鸡蛋的数量除以5;5:用户鸡蛋的数量又两部分组成,自己已有的鸡蛋和距离最近一次把鸡蛋孵化成,到当前能产生的鸡蛋...原创 2022-05-14 02:23:32 · 2561 阅读 · 0 评论 -
以太坊数据签署(二)
写在前面在上一篇文章中,我们简单介绍了以太坊数据签署,在这边文章我们将直接讲一些使用案例,处理一些业务逻辑简单签署消息var sign = require('@metamask/eth-sig-util');const helloWorldSignature = '0x90a938f7457df6e8f741264c32697fc52f9a8f867c52dd70713d9d2d472f2e415d9c94148991bbe1f4a1818d1dff09165782749c8.原创 2022-04-23 04:43:21 · 1362 阅读 · 0 评论 -
EIP-1559
EIP-1559是一项以太坊改进提案,旨在优化以太坊区块链的费用市场系统。EIP-于 2021 年 8 月 5 日在伦敦硬分叉升级中激活-将改变以太坊 gas 费用的计算方式,从而简化交易 UX,改善 ETH 的经济性,并总体提高以太坊的安全性。EIP-1559 的起源受以太坊联合创始人Vitalik Buterin和 EthHub 联合创始人Eric Conner早期研究的影响,EIP-1559 由 Buterin、Conner 和少数其他以太坊核心开发人员于 2019 年 4 月正...翻译 2022-02-28 14:40:20 · 870 阅读 · 0 评论 -
以太坊(ETHEREUM)全局函数
pragma solidity ^0.4.0;contract modifierTest{ bytes32 public blockhash; address public coinbase; uint public difficulty; uint public gaslimit; uint public blockNum; uint public timestamp; bytes public calldata1; uint publ.原创 2022-02-25 19:20:38 · 466 阅读 · 0 评论 -
uniswap合约解读和部署
了解uniswap官方中文:http://uniswap.defiplot.com/#/swap 官方英文:https://app.uniswap.org github源码:Uniswap · GitHub 如何工作:https://uniswap.org/docs/v2/protocol-overview/how-uniswap-works/ 术语解释:https://uniswap.org/docs/v2/protocol-overview/glossary/ 视频教程:手把手教你开发去原创 2022-01-21 02:17:20 · 13397 阅读 · 0 评论 -
升级智能合约(Hardhat)
原文链接使用OpenZeppelin升级插件部署的智能合约可以通过升级来修改代码,同时保留原合约地址、状态和余额。这让帮助我们为项目添加新功能,或修复在生产中可能发现的任何错误。在本指南中,我们将学习: 为什么升级很重要 使用升级插件升级我们的盒子。 了解升级在引擎盖下是如何工作的 学习如何编写可升级合约 什么是可升级的合约以太坊中的智能合约默认情况下是不可更改的。一旦创建了就无法改变,有效地为合约参与者扮演了不可篡改的合约的角色。然而某些场景下,我们转载 2022-01-15 02:31:59 · 1071 阅读 · 0 评论 -
编写可升级的智能合约
原文链接当使用OpenZeppelin Upgrades编写可升级合约时,有一些在编写Solidity代码时需要记住一些注意事项。值得一提的是,这些限制源于以太坊虚拟机的工作方式,并且适用于所有使用可升级合约的项目,而不仅仅是OpenZeppelin Upgrades。初始化器(Initializers)在编写Solidity合约使用OpenZeppelin Upgrades,无需任何修改,只需要修改构造函数。由于基于代理的可升级性系统的要求,可升级合约中不能使用构造函数。要了解这个限制背后转载 2022-01-15 02:29:22 · 906 阅读 · 0 评论 -
部署OpenZeppelin可升级合约
首次部署需要部署三个合约,分别是逻辑合约,ProxyAdmin,TransparentUpgradeProxy。逻辑合约就是我们自己的业务合约,需要满足OpenZeppelin可升级合约的条件。以下业务合约以Params合约为例进行说明。业务合约Params// SPDX-License-Identifier: MITpragma solidity ^0.8.0;import "@openzeppelin/contracts-upgradeable/proxy/utils/Init.转载 2022-01-15 01:57:40 · 1873 阅读 · 0 评论 -
Solidity的三种合约间的调用方式 call、delegatecall 和 callcode
最近开始学习以太坊智能合约编程,其中涉及到智能合约之间的函数调用。Solidity的三种合约间的调用方式有call、delegatecall 和 callcode这3种方式。参考了下面的文章:https://www.cnblogs.com/x-poior/p/10511552.html对于文章中提到的三种调用方式的异同点call: 最常用的调用方式,调用后内置变量 msg 的值会修改为调用者,执行环境为被调用者的运行环境(合约的 storage)。delegatecall: 调用后内置变量 ms转载 2022-01-15 01:38:56 · 1852 阅读 · 0 评论 -
合约升级模式分析
对两种合约升级模式的分析编者注: 原文发表于 2018 年 9 月,当时没有成熟的库或工具来实现升级。现在有了upgrades-plugins让升级变得简单很多。不过文中提到的很多关于合约升级的问题,在今天来看依旧非常有价值,也是社区选择翻译它的原因。智能合约设计的一个流行趋势是促进可升级合约的发展。在 Trail of Bits ,我们已经审查了很多可升级合约,并认为这一趋势的方向是错误的。现有的升级合约的技术有缺陷,大大增加了合约的复杂性,容易产生 bug 。为了强调这一点,我们发布了..翻译 2022-01-15 01:16:10 · 550 阅读 · 0 评论 -
solidity智能合约与智能合约转账授权或智能合约向另一个智能合约转账
//代码通用于5点几到6点几版本library TransferHelper { function safeApprove(address token, address to, uint value) internal { bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelect.原创 2021-03-25 21:20:04 · 3073 阅读 · 0 评论 -
solidity限制1个块中只能有1个操作者,防止多次调用。
pragma solidity ^0.6.12;contract ContractGuard { mapping(uint256 => mapping(address => bool)) private _status; function checkSameOriginReentranted() internal view returns (bool) { return _status[block.number][tx.origin]; } .原创 2021-01-25 16:49:15 · 292 阅读 · 1 评论 -
solidity时间操作函数集
solidity时间函数处理集pragma solidity ^0.6.0;// ----------------------------------------------------------------------------// BokkyPooBah's DateTime Library v1.01//// A gas-efficient Solidity date and time library//// https://github.com/bokkypoo...原创 2021-01-08 16:36:45 · 1224 阅读 · 0 评论 -
如何在智能合约中调用另一个智能合约payable方法并发送资金和传参数
原版的在另一个带有参数的合约中调用一个函数并发送资金的一般语法是:address.func.value(amount)(arg1, arg2, arg3)func需要具有payable修改器(对于Solidity 0.4+)。pragma solidity ^0.4.0;contract PayMain { Main main; function PayMain(address _m) { main = Main(_m); } function () payab.原创 2021-01-01 23:32:27 · 2266 阅读 · 0 评论 -
以太坊合约漏洞测试工具
漏洞测试工具简介 MaABBTicore MaABBTicore 是一个分析二进制文件和智能合约的符号执行工具, MaABBTicore 包含一个符号区块链虚拟机(EVM),一个 EVM 反汇编器/汇编器 以及一个用于自动编译和分析 Solidity 的方便界面。它还集成了 Ethersplay,用 于 EVM 字节码的 Bit of Traits of Bits 可视化反汇编程序,用于可视化分析。 与 二进制文件一样,MaABBTicore 提供了一个简单的命令行界面和一个用于分析 ...原创 2020-12-04 11:18:21 · 1341 阅读 · 1 评论 -
solidity智能合约删除数组||删除指定索引的数组
在数组上使用delete会留下空白; 需要手动移动元素并更新length属性。contract MyContract { uint[] array = [1,2,3]; //删除指定索引的数组元素 function removeAtIndex(uint index) public returns (uint[]) { if (index >= array.length) return; for (uint i = index; i < array.lengt原创 2020-11-12 21:01:21 · 3828 阅读 · 0 评论 -
solidity合约开发-SafeMath
SafeMath 的部分代码:library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) inte原创 2020-11-09 21:16:41 · 1188 阅读 · 0 评论 -
Uniswap中的LP token的数值是如何计算出来的
LP token 的数量是两个币的数量(用最小单位表示的数量)的升级再开根号。例如:token A 和token B价格设定为:3:300,那么提供流动性3个A和300个B,可以获得30个LP原创 2020-10-07 19:24:59 · 7238 阅读 · 5 评论 -
函数和状态变量有四种可见性类型external ,public ,internal 或者 private
由于 Solidity 有两种函数调用(内部调用不会产生实际的 EVM 调用或称为“消息调用”,而外部调用则会产生一个 EVM 调用), 函数和状态变量有四种可见性类型。 函数可以指定为external,public,internal或者private,默认情况下函数类型为public。 对于状态变量,不能设置为external,默认是internal。external:外部函数作为合约接口的一部分,意味着我们可以从其他合约和交易中调用。 一个外部函数f不能从内部调用(即f...原创 2020-09-04 18:22:30 · 1621 阅读 · 0 评论 -
uniswap的uml设计图 || uniswap源码|| uniswap开发
上面是uniswap的uml设计图源码地址:https://github.com/Uniswap/uniswap-v1联系作者原创 2020-09-04 17:09:24 · 804 阅读 · 0 评论 -
forsage开源代码||forsage源代码开发(二)
/** *Submitted for verification at Etherscan.io on 2019-08-29*//** * * ███╗ ███╗██╗██╗ ██╗ ██╗ ██████╗ ███╗ ██╗ * ████╗ ████║██║██║ ██║ ██║██╔═══██╗████╗ ██║ * ██╔████╔██║██║██║ ██║ ██║██║ ██║██╔██╗ ██║ * ██║╚██╔╝█.原创 2020-09-04 12:53:59 · 283 阅读 · 0 评论 -
forsage开源代码||forsage源代码(一)
/** *Submitted for verification at Etherscan.io on 2020-01-31*//**** ,d8888b * 88P' *d888888P ...原创 2020-09-04 12:50:53 · 347 阅读 · 0 评论