从密码学看盲拍合约:智能合约的隐私与安全新革命!
文章目录
- 前言
- 一、什么是盲拍合约?
- 二、盲拍合约的优势
- 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);}
}
总结
通过本文,我们详细介绍了盲拍合约的定义、优势、工作原理及其代码实现。盲拍合约利用密码学原理为参与者提供隐私保护,减轻时间压力,并确保出价的绑定与秘密。我们讲解了参与者如何提交盲出价、披露出价、结束拍卖及退款机制。希望这篇文章能帮助你深入理解盲拍合约及其在区块链中的应用。如果你有任何疑问或建议,欢迎在评论区留言讨论🌹
相关文章:

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

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

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

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

《凡人歌》中的IT职业启示录
《凡人歌》是由中央电视台、正午阳光、爱奇艺出品,简川訸执导,纪静蓉编剧,侯鸿亮任制片,殷桃、王骁领衔主演,章若楠、秦俊杰、张哲华、陈昊宇主演的都市话题剧 ,改编自纪静蓉的小说《我不是废柴》。该剧于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,你需要确保你的包同时提供了CommonJS和ES6模块的入口点。这通常是通过在package.json文件中指定main和module字段来实现的,以及在构建过程中生成两种不同模块格式的文件。 以下是具体步骤: 设置pa…...

便捷将屏幕投射到安卓/iOS设备-屏幕投射到安卓/iOS设备,Windows/Mac电脑或智能电视上-供大家学习研究参考
1. 下载并安装软件(安卓苹果都需要) 确保 Android 设备和 Windows/Mac电脑都安装。启动应用程序并将 Android 设备和 Windows / Mac 了解到同一个wifi下面。 2、 发起投屏请求 在接收设备上:...

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

Centos8.5.2111(1)之本地yum源搭建和docker部署与网络配置
由于后边可能要启动多个服务,避免服务之间相互干扰,本课程建议每个服务独立部署到一台主机上,这样做会导致资源占用过多,可能会影响系统的运行。服务器部署一般不采用GUI图形界面部署,而是采用命令行方式部署ÿ…...

基于SSM+小程序的自习室选座与门禁管理系统(自习室1)(源码+sql脚本+视频导入教程+文档)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 1、管理员实现了首页、基础数据管理、论坛管理、公告信息管理、用户管理、座位管理等 2、用户实现了在论坛模块通过发帖与评论帖子的方式进行信息讨论,也能对账户进行在线充值…...

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

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

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

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

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

手写代码,利用 mnist 数据集测试对比 kan 和 cnn/mlp 的效果
你好呀,我是董董灿。 kan 模型火了一段时间,很多人从理论的角度给出了非常专业的解读,基本结论是:从目前来看,kan 很难替代 mlp 成为一个更加经典的模型结构。 我这里就不从理论方面进行回答了,直接给出一…...

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

15年408计算机网络
第一题: 解析: 接收方使用POP3向邮件服务器读取邮件,使用的TCP连接,TCP向上层提供的是面向连接的,可靠的数据传输服务。 第二题: 解析:物理层-不归零编码和曼彻斯特编码 编码1:电平在…...

C++ const关键字
const 1. 修饰变量(包括函数参数 函数返回值) const int v0 10; v0 0; // error 不能修改const修饰的变量 2. 修饰指针 int v1 10; int v2 20; int v3 30; 2.1 常量指针 const 在指针左边,左定值,即不能通过指针修改该…...

python爬虫案例——腾讯网新闻标题(异步加载网站数据抓取,post请求)(6)
文章目录 前言1、任务目标2、抓取流程2.1 分析网页2.2 编写代码2.3 思路分析前言 本篇案例主要讲解异步加载网站如何分析网页接口,以及如何观察post请求URL的参数,网站数据并不难抓取,主要是将要抓取的数据接口分析清楚,才能根据需求编写想要的代码。 1、任务目标 目标网…...

LeetCode416:分割等和子集
题目链接:416. 分割等和子集 - 力扣(LeetCode) 代码如下: class Solution { public:bool canPartition(vector<int>& nums) {int m nums.size();vector<int> dp(10010, 0);int sum 0;for(int i 0; i < m;…...

自定义异常注解处理框架
首先我们定义两个用于检验string和List的注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** author caiyi.yu* 自定义非空判断*/ Target(Elemen…...

【小程序】微信小程序课程 -3 快速上手之常用方法
目录 1、 对话框 1.1 模态对话框 1.2 消息对话框 2、 存储 2.1 同步 2.1.1 同步保存数据 2.1.2 同步获取数据 2.1.3 同步删除数据 2.1.4 同步清空数据 2.2 异步 2.2.1 异步保存数据 2.2.2 异步获取数据 2.2.3 异步删除数据 2.2.4 异步清空数据 3、 上拉加载更多…...

iOS 小组件
基本知识 时间轴 小组件通过AppIntentTimelineProvider进行 UI 刷新 struct Provider: AppIntentTimelineProvider {func placeholder(in context: Context) -> SimpleEntry {// 添加占位的(选择添加的时候使用)// todo}func snapshot(for configu…...

【2.使用VBA自动填充Excel工作表】
目录 前言什么是VBA如何使用Excel中的VBA简单基础入门控制台输出信息定义过程(功能)定义变量常用的数据类型Set循环For To 我的需求开发过程效果演示文件情况测试填充源文件测试填充目标文件 全部完整的代码sheet1中的代码,对应A公司工作表Us…...

算法记录——链表
2.链表 2.1判断是否是回文链表 1.方法一:利用栈反转链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode…...

EasyExcel实现百万数据批量导出
当数据量比较大时,例如数据量达到百万级,传统的一次读取到内存中在写入excel文件的方法便不再适用了,可能会导致内存溢出;而且一次性将数据写入一张sheet工作表也不太好。 但我们可以选择数据分片的方式批量写入多个工作表。 测试…...

兆易GD32E508的SHRTIM配置 主从定时器 产生2对相位可调互补PWM 带死区
如有技术问题及技术需求请加作者微信! GD32E5系列MCU是基于Arm Cortex-M33处理器的32位通用微控制器。Cortex-M33处理器基于Armv8架构,处理器主频最高可达180MHz,支持强大的可扩展指令集,包括通用数据处理I/O控制任务、增强的数据处理位域操作、DSP和浮点运算器(FPU)。 GD…...