首页 > 其他分享 >BNB代币燃烧分红系统开发实现技术详细

BNB代币燃烧分红系统开发实现技术详细

时间:2024-01-04 16:01:04浏览次数:27  
标签:uint256 代币 分红 BITPOS lt flags address owner BNB

 

定义如下:function _nextExtraData(    address from,    address to,    uint256 prevOwnershipPacked) private view returns (uint256) {    uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);    return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;此函数用于写入额外的信息,开发者需要自行定义 _extraData 函数以实现相关数据的写入。此过程的核心函数为 _packOwnershipData ,其定义如下:function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {    assembly {        // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.        owner := and(owner, _BITMASK_ADDRESS)        // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.        result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))    }}有了上述 _nextInitializedFlag 和 _nextExtraData 的补充和注释,相信读者可以理解 _packOwnershipData 的实现原理,简单来说,该函数使用 or 操作符拼接 owner 、 timestamp 和 flags 以实现最终的数据结构。显然,我们只需要构造以下部分作为flags输入,即可完成 _packOwnershipData 的构造:// - [224]      `burned`// - [225]      `nextInitialized`// - [232..255] `extraData`读者可以注意到 owner 、 timestamp 和 flags 均为 uint256 数据类型,所以直接使用 or 进行拼接是合适的接下来设置 _packedAddressData 数据结构。此数据结构定义如下:// Bits Layout:// - [0..63]    `balance`// - [64..127]  `numberMinted`// - [128..191] `numberBurned`// - [192..255] `aux`mapping(address => uint256) private _packedAddressData;mint 过程仅涉及 balance 和 numberMinted 两部分数据。所以设置较为简单,代码如下:_packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);1我们使用 ((1 << _BITPOS_NUMBER_MINTED) | 1) 构造(此处 _BITPOS_NUMBER_MINTED = 64 )出如下二进制数字 (以 16 进制表示):0b100000011使用 Python 运行 bin((64 << 1) | 1) 可以获得此结果所以我们可以直接将数字与 balance 和 numberMinted 对齐相加。在释放 Transfer 事件前,我们需要对 NFT 接受方的地址进行简单校验,即保证 NFT 接受方的地址不为 0 地址,校验代码如下:uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS;if (toMasked == 0) _revert(MintToZeroAddress.selector);此处进行了一个有趣的操作,将地址转化为 uint256 后与 0 进行比较。此处涉及 address 与 uint256 类型的转化。众所周知, address 类型事实上就是 uint160 ,两者可以直接转化。如果读者对 address 类型不熟悉,可参考 文档在直接转化后,为了避免直接转化导致的高位不为 0 的特殊情况出现,我们使用 _BITMASK_ADDRESS 进行清理。此常量定义如下:uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;1通过使用此常量进行 & ,我们可以保证 address 与 uint256 的安全转换。此处我们没有深入讨论为什么 uint160 到 uint256 的直接转化可能导致高位不为 0 的情况发生,读者可编写一简单合约编译后使用字节码研究此问题释放 Transfer 事件,此处我们可以一窥 emit 背后的原理:uint256 end = startTokenId + quantity;uint256 tokenId = startTokenId;do {    assembly {        // Emit the `Transfer` event.        log4(            0, // Start of data (0, since no data).            0, // End of data (0, since no data).            _TRANSFER_EVENT_SIGNATURE, // Signature.            0, // `address(0)`.            toMasked, // `to`.            tokenId // `tokenId`.        )    }    // The `!=` check ensures that large values of `quantity`    // that overflows uint256 will make the loop run out of gas.} while (++tokenId != end);

标签:uint256,代币,分红,BITPOS,lt,flags,address,owner,BNB
From: https://blog.51cto.com/u_16489205/9102057

相关文章

  • 阿里巴巴宣布分红 25 亿美元;苹果故意降低 iPhone 性能被判赔偿丨 RTE 开发者日报 Vol.
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......
  • 【漏洞分析】Reflection Token 反射型代币攻击事件通用分析思路
    在本篇文章中,我将通过一个攻击事件引出ReflectionToken攻击事件的一个通用分析思路。关于ReflectionToken的其他案例分析,可以参考BEVO代币攻击事件分析及复现一文。TomInu攻击事件TomInuToken是一个反射型代币reflectiontoken,于2023-01-26遭到黑客攻击,攻击者获利355......
  • 银行股票以及分红年化收益,你会买吗?
    计算规则,当前股价乘以10为总金额,用股息除以总金额为收益乘以百分百。名称分红股价年化收益紫金银行10派12.583.8兰州银行10派12.83.5光大银行10派1.92.926.5青岛银行10派1.63.175西安银行10派1.653.444.7江阴银行10派1.83.614.9......
  • 把bsc的合约代码部署到opbnb
    1.找到bsc已经正式部署的合约https://bscscan.com/ 2.拷贝ContractSourceCode把文件导出为xxx.sol 3.把导出的sol文件导入remix编辑器打开remix编辑器https://remix.ethereum.org/#lang=en&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.18+com......
  • 网工内推 | 售后工程师,IP认证优先,最高15薪,年底有分红
    01威发系统(中国)有限公司招聘岗位:售后工程师职责描述:1、负责各种规模的项目售后安装、调试和维护工作;2、解决工程和维护中的一般技术问题,支持、协助处理其他相关的技术问题;3、与客户建立和保持良好关系,及时提出解决问题的方法,并为客户提供培训和技术咨询;4、熟练、准确地了解公司产......
  • eslint airbnb React18+typescript 依赖循环、import自动排序分组
    eslint终极规范爱彼迎eslint-config-airbnb请先阅读完下以下链接在来配置代码规范之什么是eslint,为什么要使用eslinteslint的配置项过多,针对js、ts、vue、jsx、tsx等等不同的规则,小公司或者个人项目可以使用成熟的eslint社区规范,如airbnb、standard、goole等。这里我们介绍......
  • 证券型代币成为新焦点!交易上链,合规也要上链?
       “数字化正在使传统行业的边界变得模糊,这是一场真正的金融革命。”麦肯锡早在2017年的《在没有边界的世界中竞争》报告中就以此形容了数字化浪潮。随着对虚拟资产的全球接受度增加,监管机构也开始对其潜力展开讨论。    当代币被视为金融工具时,证券型代币成为各国监管机构......
  • 探索后疫情时代Airbnb实现逆周期增长的四大策略
    ​01.发挥P2P优势,打造差异化的“旅居生活体验”P2P(Peer-to-Peer)是一种点对点的网络模式,即用户之间可以直接进行交流和交易,无需通过中介或第三方机构。早期Airbnb对P2P的利用仅局限在空置房间的供应上,初期目标客户定位为只追求便宜价格的沙发客,这一客户群体不要求过多的舒适的住......
  • tBNB怎么购买比较靠谱?币售Bisell购买测试币教程
    随着测试币水龙头的日渐枯竭,对于很多开发者和撸毛用户来说,去哪里领水是个大问题。于是,基于测试币的交易平台——币售Bisell就出现了。币售Bisell提供几乎所有测试链的测试币交易服务,包括tBNB、GoerliETH、AGOR、SepoliaETH测试币等等,可以以任何方式买到自己想要的测试币。......
  • Python爱彼迎Airbnb新用户体验数据XGBoost、随机森林预测
    全文链接:http://tecdat.cn/?p=32380原文出处:拓端数据部落公众号分析师:ZhuhuaHuang在多项用户数据中寻找与预测值相关的属性。查看各个特征的分布与特征之间的关联。分析用户数据,查看特定人群的使用习惯进行产品优化。最后选择合适的模型与参数来进行预测。解决方案任务/目标......