当前位置: 首页 > news >正文

从密码学看盲拍合约:智能合约的隐私与安全新革命!

文章目录

  • 前言
  • 一、什么是盲拍合约?
  • 二、盲拍合约的优势
    • 1.时间压力的缓解
    • 2.绑定与秘密的挑战
  • 三、盲拍合约的工作原理
    • 1.提交盲出价
    • 2.披露出价
    • 3.结束拍卖
    • 4.退款机制
  • 四、代码示例
  • 总结


前言

随着区块链技术的发展,智能合约在各种场景中的应用越来越广泛。盲拍合约作为一种新兴的智能合约形式,利用密码学原理为参与者提供了隐私保护和安全保障。这种合约不仅增强了竞拍的公平性,还消除了时间压力,让参与者能够在更为放松的环境中进行投标。本文将深入探讨盲拍合约的定义、优势、工作原理以及代码实现,旨在为读者提供一个全面的理解。

在这里插入图片描述


一、什么是盲拍合约?

盲拍合约是一种智能合约,允许参与者在不公开其出价的情况下进行竞拍。参与者提交一个“盲出价”,其中包含出价金额、一个虚假的标记以及一个秘密值。只有在竞拍结束时,参与者才能披露这些信息,从而验证他们的出价。

二、盲拍合约的优势

盲拍合约的好处在于,参与者在投标结束前不会感受到时间压力。在透明的计算平台上进行秘密竞拍听起来似乎矛盾,但密码学的应用使这一切成为可能。

1.时间压力的缓解

在投标期间,投标人实际上并没有发送真实出价,而只是发送出价的哈希版本。由于几乎不可能找到两个(足够长的)值,其哈希值相等,投标人可以通过这种方式提交出价。投标结束后,投标人必须公开他们的出价,合约会检查披露的出价是否与之前提交的哈希值相同。

2.绑定与秘密的挑战

另一个挑战是如何使拍卖同时做到绑定与秘密。唯一能阻止投标者在赢得拍卖后不付款的方式是让她将钱连同出价一起发送。但由于以太坊中资金转移不可隐藏,任何人都可以看到转移的资金。

合约通过接受任何大于当前最高出价的值来解决这个问题。虽然在披露阶段才进行检查,有些出价可能是无效的,但这也是故意的。投标人可以通过设置几个高或低的无效出价来迷惑竞争对手。

三、盲拍合约的工作原理

1.提交盲出价

参与者通过 bid 函数提交盲出价,计算方式为:
在这里插入图片描述

在这里,value 是实际出价金额,fake 是一个布尔值,用于隐藏真实出价,secret 是一个32字节的秘密字符串,用于防止加密前过于简单而导致容易暴力破解的情况。此计算使得盲出价在未披露前无法被识别

2.披露出价

在竞拍结束后,参与者使用 reveal 函数披露出价。只有正确披露的出价会被验证:
在这里插入图片描述
如果出价有效且未标记为假,合约会将其视为有效出价并处理

3.结束拍卖

在竞拍结束后,auctionEnd 函数将确定最高出价并将其转移给部署合约时设置的三个参数受益人:
在这里插入图片描述

4.退款机制

对于无效出价或低于最高出价的出价,合约会将存入的保证金退还给参与者。这通过 pendingReturns 映射来实现
在这里插入图片描述

四、代码示例

以下是完整的盲拍合约代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;contract BlindAuction {struct Bid {bytes32 blindedBid;uint deposit;}address payable public beneficiary;uint public biddingEnd;uint public revealEnd;bool public ended;mapping(address => Bid[]) public bids;address public highestBidder;uint public highestBid;// 可以取回的之前的出价mapping(address => uint) public pendingReturns;event AuctionEnded(address winner, uint highestBid);// 定义错误error TooEarly(uint currentTime, uint endTime);error TooLate(uint currentTime, uint endTime);error AuctionAlreadyEnded();/// 使用 modifier 可以更便捷的校验函数的入参。/// `onlyBefore` 会被用于后面的 `bid` 函数:/// 新的函数体是由 modifier 本身的函数体,并用原函数体替换 `_;` 语句来组成的。// modifier onlyBefore(uint _time) { require(block.timestamp < _time); _; }// modifier onlyAfter(uint _time) { require(block.timestamp > _time); _; }modifier onlyBefore(uint _time) {if (block.timestamp >= _time) revert TooLate(block.timestamp, _time);_;}modifier onlyAfter(uint _time) {if (block.timestamp <= _time) revert TooEarly(block.timestamp, _time);_;}constructor(uint _biddingTime,uint _revealTime,address payable _beneficiary) {beneficiary = _beneficiary;biddingEnd = block.timestamp + _biddingTime;revealEnd = biddingEnd + _revealTime;}/// 可以通过 `_blindedBid` = keccak256(value, fake, secret)/// 设置一个秘密竞拍。/// 只有在出价披露阶段被正确披露,已发送的以太币才会被退还。/// 如果与出价一起发送的以太币至少为 “value” 且 “fake” 不为真,则出价有效。/// 将 “fake” 设置为 true ,然后发送满足订金金额但又不与出价相同的金额是隐藏实际出价的方法。/// 同一个地址可以放置多个出价。// function bid(bytes32 _blindedBid)//     external//     payable//     onlyBefore(biddingEnd)// {//     bids[msg.sender].push(Bid({//         blindedBid: _blindedBid,//         deposit: msg.value//     }));// }function bid(uint value, bool fake, bytes32 secret)externalpayableonlyBefore(biddingEnd){// 计算 blindedBid 内部使用,仅供存储或其他用途bytes32 blindedBid = keccak256(abi.encodePacked(value, fake, secret));bids[msg.sender].push(Bid({blindedBid: blindedBid,deposit: msg.value}));}/// 披露你的秘密竞拍出价。/// 对于所有正确披露的无效出价以及除最高出价以外的所有出价,你都将获得退款。function reveal(uint[] memory _values,bool[] memory _fake,bytes32[] memory _secret)externalpayableonlyAfter(biddingEnd)onlyBefore(revealEnd){uint length = bids[msg.sender].length;require(_values.length == length, "Mismatched values length");require(_fake.length == length, "Mismatched fake flags length");require(_secret.length == length, "Mismatched secrets length");uint refund;for (uint i = 0; i < length; i++) {Bid storage bidInfo = bids[msg.sender][i];(uint value, bool fake, bytes32 secret) =(_values[i], _fake[i], _secret[i]);if (bidInfo.blindedBid != keccak256(abi.encodePacked(value, fake, secret))) {// 出价未能正确披露// 不返还订金continue;}refund += bidInfo.deposit;if (!fake && bidInfo.deposit >= value) {if (placeBid(msg.sender, value))refund -= value;}// 使发送者不可能再次认领同一笔订金bidInfo.blindedBid = bytes32(0);}// Cast msg.sender to address payableaddress payable sender = payable(msg.sender);sender.transfer(refund);}// 这是一个 "internal" 函数, 意味着它只能在本合约(或继承合约)内被调用function placeBid(address bidder, uint value) internalreturns (bool success){if (value <= highestBid) {return false;}if (highestBidder != address(0)) {// 返还之前的最高出价pendingReturns[highestBidder] += highestBid;}highestBid = value;highestBidder = bidder;return true;}/// 取回出价(当该出价已被超越)function withdraw() public payable {uint amount = pendingReturns[msg.sender];if (amount > 0) {// 这里很重要,首先要设零值。// 因为,作为接收调用的一部分,// 接收者可以在 `transfer` 返回之前重新调用该函数。(可查看上面关于‘条件 -> 影响 -> 交互’的标注)pendingReturns[msg.sender] = 0;// Cast msg.sender to address payableaddress payable sender = payable(msg.sender);sender.transfer(amount);}}/// 结束拍卖,并把最高的出价发送给受益人function auctionEnd()publicpayableonlyAfter(revealEnd){// require(!ended);if (ended) revert AuctionAlreadyEnded();emit AuctionEnded(highestBidder, highestBid);ended = true;beneficiary.transfer(highestBid);}
}

总结

通过本文,我们详细介绍了盲拍合约的定义、优势、工作原理及其代码实现。盲拍合约利用密码学原理为参与者提供隐私保护,减轻时间压力,并确保出价的绑定与秘密。我们讲解了参与者如何提交盲出价、披露出价、结束拍卖及退款机制。希望这篇文章能帮助你深入理解盲拍合约及其在区块链中的应用。如果你有任何疑问或建议,欢迎在评论区留言讨论🌹

相关文章:

从密码学看盲拍合约:智能合约的隐私与安全新革命!

文章目录 前言一、什么是盲拍合约&#xff1f;二、盲拍合约的优势1.时间压力的缓解2.绑定与秘密的挑战 三、盲拍合约的工作原理1.提交盲出价2.披露出价3.结束拍卖4.退款机制 四、代码示例总结 前言 随着区块链技术的发展&#xff0c;智能合约在各种场景中的应用越来越广泛。盲…...

c++学习笔记(47)

七、_public.cpp #include "_public.h" // 如果信号量已存在&#xff0c;获取信号量&#xff1b;如果信号量不存在&#xff0c;则创建它并初始化为 value。 // 如果用于互斥锁&#xff0c;value 填 1&#xff0c;sem_flg 填 SEM_UNDO。 // 如果用于生产消费者模型&am…...

软件设计之SSM(1)

软件设计之SSM(1) 路线图推荐&#xff1a; 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版SSM框架全套视频教程&#xff0c;Spring6SpringBoot3最新SSM企业级开发 资料可以去尚硅谷官网免费领取 学习内容&#xff1a; Spring框架结构SpringIoC容器SpringIoC实践…...

STM32F745IE 能进定时器中断,无法进主循环

当你遇到STM32F745IE这类问题,即能够进入定时器中断但无法进入主循环(main() 函数中的循环),可能的原因和解决方法包括以下几个方面: 检查中断优先级和嵌套: 确保没有其他更高优先级的中断持续运行并阻止了主循环的执行。使用调试工具查看中断的进入和退出情况。检查中断…...

《凡人歌》中的IT职业启示录

《凡人歌》是由中央电视台、正午阳光、爱奇艺出品&#xff0c;简川訸执导&#xff0c;纪静蓉编剧&#xff0c;侯鸿亮任制片&#xff0c;殷桃、王骁领衔主演&#xff0c;章若楠、秦俊杰、张哲华、陈昊宇主演的都市话题剧 &#xff0c;改编自纪静蓉的小说《我不是废柴》。该剧于2…...

go libreoffice word 转pdf

一、main.go 关键代码 完整代码 package mainimport ("fmt""github.com/jmoiron/sqlx""github.com/tealeg/xlsx""log""os/exec""path/filepath" ) import _ "github.com/go-sql-driver/mysql"import &q…...

打造双模兼容npm包:无缝支持require与import

为了实现一个npm包同时支持require和import&#xff0c;你需要确保你的包同时提供了CommonJS和ES6模块的入口点。这通常是通过在package.json文件中指定main和module字段来实现的&#xff0c;以及在构建过程中生成两种不同模块格式的文件。 以下是具体步骤&#xff1a; 设置pa…...

便捷将屏幕投射到安卓/iOS设备-屏幕投射到安卓/iOS设备,Windows/Mac电脑或智能电视上-供大家学习研究参考

1. 下载并安装软件(安卓苹果都需要) 确保 Android 设备和 Windows/Mac电脑都安装。启动应用程序并将 Android 设备和 Windows / Mac 了解到同一个wifi下面。 2、 发起投屏请求 在接收设备上:...

yolox训练自己的数据集

环境搭建 gpu按自己情况安装 nvidia-smi 查看自己的版本 CUDA和cudnn 按自己的安装&#xff0c;我的驱动551.76&#xff0c;注意不要用最新的&#xff0c;官网只要求驱动是大于等于&#xff0c;可以用低版本的cuda&#xff0c;我安装的是CUDA 11.1 cuda下载后&#xff0c…...

Centos8.5.2111(1)之本地yum源搭建和docker部署与网络配置

由于后边可能要启动多个服务&#xff0c;避免服务之间相互干扰&#xff0c;本课程建议每个服务独立部署到一台主机上&#xff0c;这样做会导致资源占用过多&#xff0c;可能会影响系统的运行。服务器部署一般不采用GUI图形界面部署&#xff0c;而是采用命令行方式部署&#xff…...

基于SSM+小程序的自习室选座与门禁管理系统(自习室1)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 1、管理员实现了首页、基础数据管理、论坛管理、公告信息管理、用户管理、座位管理等 2、用户实现了在论坛模块通过发帖与评论帖子的方式进行信息讨论&#xff0c;也能对账户进行在线充值…...

支付宝远程收款api之小荷包跳转码

想要生成小荷包跳转码的二维码&#xff0c;需要进行以下步骤&#xff1a; 1、开通支付宝小荷包的收款功能权限 2、获取支付宝的小荷包收款码和支付宝账户的UID已经手机号等相应信息&#xff08;可能会有变动&#xff09; 3、可能需要一定的代码基础&#xff0c;讲所需信息填…...

STM32 F1移植FATFS文件系统 USMART组件测试相关函数功能

STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能 文章目录 STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能前言部分主要相关代码# USMART介绍1. mf_scan_files 扫描磁盘文件2. mf_mount 挂载磁盘3. mf_open 打开文件4. mf_read 读数据内容5. mf…...

YOLOv8改进 | 融合篇,YOLOv8主干网络替换为MobileNetV3+CA注意机制+添加小目标检测层(全网独家首发,实现极限涨点)

原始 YOLOv8 训练结果: YOLOv8 + MobileNetV3改进后训练结果: YOLOv8 + MobileNetV3 + CA 注意机制 + 添加小目标检测层改进后训练结果(极限涨点): 摘要 小目标检测难点众多,导致很多算法对小目标的检测效果远不如大中型目标。影响算法性能的主要原因如下:第一,小目…...

深入探索机器学习中的目标分类算法

在当今数据驱动的世界中&#xff0c;机器学习&#xff08;Machine Learning, ML&#xff09;正逐渐成为解决问题的重要工具。在众多机器学习任务中&#xff0c;目标分类&#xff08;Classification&#xff09;算法尤其受到关注。本文将深入探讨目标分类算法的基本概念、常见类…...

一文上手SpringSecurity【七】

之前我们在测试的时候,都是使用的字符串充当用户名称和密码,本篇将其换成MySQL数据库. 一、替换为真实的MySQL 1.1 引入依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</v…...

深圳龙链科技:全球区块链开发先锋,领航Web3生态未来

【深圳龙链科技】是全球领先的Web3区块链技术开发公司&#xff0c;专注于为全球客户提供创新高效的区块链解决方案。 深圳龙链科技由币安资深股东携手香港领先的Web3创新枢纽Cyberport联袂打造&#xff0c;立足于香港这一国际金融中心&#xff0c;放眼全球&#xff0c;汇聚了华…...

手写代码,利用 mnist 数据集测试对比 kan 和 cnn/mlp 的效果

你好呀&#xff0c;我是董董灿。 kan 模型火了一段时间&#xff0c;很多人从理论的角度给出了非常专业的解读&#xff0c;基本结论是&#xff1a;从目前来看&#xff0c;kan 很难替代 mlp 成为一个更加经典的模型结构。 我这里就不从理论方面进行回答了&#xff0c;直接给出一…...

基于Java+SQL Server2008开发的(CS界面)个人财物管理系统

一、需求分析 个人财务管理系统是智能化简单化个人管理的重要的组成部分。并且随着计算机技术的飞速发展&#xff0c;计算机在管理方面应用的旁及&#xff0c;利用计算机来实现个人财务管理势在必行。本文首先介绍了个人财务管理系统的开发目的&#xff0c;其次对个人财务管理…...

15年408计算机网络

第一题&#xff1a; 解析&#xff1a; 接收方使用POP3向邮件服务器读取邮件&#xff0c;使用的TCP连接&#xff0c;TCP向上层提供的是面向连接的&#xff0c;可靠的数据传输服务。 第二题&#xff1a; 解析&#xff1a;物理层-不归零编码和曼彻斯特编码 编码1&#xff1a;电平在…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...