使用 sCrypt 实现数独游戏合约

2023-11-15

我们在 BSV 区块链上实现了一个数独游戏智能合约,利用之前介绍过的一种合约范式可以将游戏中寻找解题方案的过程外包上链。因为求解数独问题的计算工作量会随着其行列数快速增长,实际上它也是一个 NP-完全 问题。不过我们可以借由 sCrypt 智能合约巧妙地寻求答案,只需要验证答案提供者所给出的解答是否满足要求即可,这样即可以将复杂的求解计算过程实现链下外包。

典型的数独游戏

sCrypt 合约代码如下:


import "array.scrypt";
import "arrayUtil.scrypt";

contract Sudoku {

    bytes board;

    static const int N = 9;
    static const bytes EMPTY = b'00';

    constructor(bytes board) {
        this.board = board;
    }

    function merge(bytes solution) : bytes {
        bytes newBoard = this.board;

        loop (N) : i {
            loop (N) : j {
                int value = readValue(newBoard, i, j);
                int inputValue = readValue(solution, i, j);
                if (value == 0) {
                    require(inputValue <= 9);
                    newBoard = setValue(newBoard, i, j, inputValue);
                }
                else {
                    require(value == inputValue);
                }
            }
        }
        return newBoard;
    }

    public function solve(bytes solution) {

        require(len(solution) == Sudoku.N * Sudoku.N);

        bytes newBord = this.merge(solution);

        Array rowArray = new Array();
        Array colArray = new Array();
        Array squareArray = new Array();

        loop (N) : i {
            loop (N) : j {
                // check for duplicate

                // in a row
                int rowElem = readValue(newBord, i, j);
                require(rowArray.indexOf(rowElem) == -1);
                rowArray.push(rowElem);

                // in a column
                int colElem = readValue(newBord, j, i);
                require(colArray.indexOf(colElem) == -1);
                colArray.push(colElem);

                // in a subgrid
                int squareElem = readSquareValue(newBord, i, j);
                require(squareArray.indexOf(squareElem) == -1);
                squareArray.push(squareElem);
            }

            rowArray.clear();
            colArray.clear();
            squareArray.clear();
        }

        require(true);
    }

    static function readValue(bytes board, int i, int j) : int {
        return Utils.fromLEUnsigned(ArrayUtil.getElemAt(board, Sudoku.index(i, j)));
    }

    static function setValue(bytes board, int i, int j, int value) : bytes {
        return ArrayUtil.setElemAt(board, index(i, j), Utils.toLEUnsigned(value, 1));
    }

    static function readSquareValue(bytes board, int i, int j) : int {
        return Utils.fromLEUnsigned(ArrayUtil.getElemAt(board, Sudoku.indexSquare(i, j)));
    }

    static function index(int row, int col) : int {
        return row * Sudoku.N + col;
    }

    static function indexSquare(int i, int j) : int {
        int row = i / 3 * 3 + j / 3;
        int col = i % 3 * 3 + j % 3;
        return Sudoku.index(row, col);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 sCrypt 实现数独游戏合约 的相关文章

  • 智能合约安全分析,假充值攻击如何突破交易所的防御?

    智能合约安全分析 假充值攻击如何突破交易所的防御 引言 假充值攻击 是指攻击者通过利用交易所在处理充值过程中的漏洞或系统错误 发送伪造的交易信息到交易所钱包地址 这些伪造的交易信息被交易所误认为是真实的充值请求 并将对应的数字资产或货币添加
  • 区块链职业培训任重道远,四个方向可入行

    作者 赛联区块链教育 张群 区块链已经来到世界14年了 中国成为重大战略也三年了 这两年区块链产业发展十分迅猛 以北京 杭州 上海 深圳 重庆 成都为代表的的区块链产业迅速崛起 成为中国区块链发展的领军者 由于在教育圈的原因 最近几年和区块
  • Nethereum:.NET应用和以太坊智能合约的桥梁

    Nethereum基本上是目前唯一可用的 NET平台下的web3 js移植包 在这个教程中 我们将首先编写并部署一个简单的智能合约 然后创建一个简单的 NET应用 并使用Nethereum来访问以太坊上的智能合约 Nethereum是通过以
  • 使用web3 部署智能合约

    CentOS 7 环境 web3安装 及 对象的创建 m0 47233175的博客 CSDN博客https blog csdn net m0 47233175 article details 121960931还未安装web3环境 请参照以
  • 莱昂哈德·欧拉生平及其成就简介

    莱昂哈德 欧拉 Leonhard Euler 1707年4月15日 1783年9月18日 瑞士数学家 自然科学家 1707年4月15日出生于瑞士的巴塞尔 1783年9月18日于俄国圣彼得堡去世 欧拉出生于牧师家庭 自幼受父亲的影响 13岁时
  • 如何通过Geth、Node.js和UNIX/PHP访问以太坊节点

    本文旨在说明通过Geth Node js如何访问以太坊节点和UNIX下PHP如何访问以太坊节点 说明如何通过RPC使用此 A 以太坊节点 对于以太坊主网络使用RPC url http 85 214 51 53 8545 对于Ropsten测
  • 智能合约漏洞案例,DEI 漏洞复现

    智能合约漏洞案例 DEI 漏洞复现 1 漏洞简介 https twitter com eugenioclrc status 1654576296507088906 2 相关地址或交易 https explorer phalcon xyz t
  • 使用Go语言和以太坊智能合约交互

    尽管最近遇到了些麻烦 但以太坊仍然是区块链领域内智能合约的最大参与者 这似乎不会很快改变 在我看来 技术本身具有很大的潜力 是从学术的角度看很有意思 但正如上面提到的问题和之前的许多问题是区块链技术方面的 智能合约 特别是具有Solidit
  • 基于区块链智能合约的疫苗溯源系统

    绪论 该系统基于以太坊的Solidity进行智能合约开发 并通过hardhat进行部署在了本机 通过Mocha和Chai进行了单元测试的编写 同时提供了一个基于React的前端界面与用户进行交互 区块链的介绍 不难看出 区块链技术对现有的经
  • stop容器

    docker ps 查看所有正在运行容器 docker stop containerId containerId 是容器的ID docker ps a 查看所有容器 docker ps a q 查看所有容器ID docker stop do
  • 这篇文章,让你了解ERC-1155 多代币标准协议

    文章目录 ERC1155 介绍 多代币标准 前提条件 代币标准 ERC 20 ERC 721 构建 ERC1155 代币合约 ERC 1155 的功能和特点 批量传输 批量余额 批量审批 接收钩子 支持非同质化代币 安全转账规则 ERC11
  • Solidity 合约安全,常见漏洞(第三篇)

    Solidity 合约安全 常见漏洞 第三篇 ERC20 代币问题 如果你只处理受信任的 ERC20 代币 这些问题大多不适用 然而 当与任意的或部分不受信任的 ERC20 代币交互时 就有一些需要注意的地方 ERC20 转账扣费 当与不信
  • 【元宇宙】智能手机万岁

    凭借出色的新设备 我们很快就能进人元字宙 想象这样的情景是很趣的 但是 至少到21世纪20年代 元宇宙时代的大多数设备很可能是我们已经在使用的设备 AR 和 VR 设备不仅面临重大的技术 财务和体验障碍 而且它们在上市后同样会面临币场反响冷
  • 物联网、区块链、元宇宙和虚拟数字人离普罗大众有多远?

    首先 我们最早理解的数字人就是数字虚拟的一个假人 可能看起来很像二次元玩偶的样子 今天我觉得数字人是一种虚拟的数字身份 无所谓你的形象是仿真或是任何形象 包括你在现实中无法实现的形象 你在梦想中所渴望的概念 无论它是什么样的 它是你在另外一
  • 使用 sCrypt 实现数独游戏合约

    我们在 BSV 区块链上实现了一个数独游戏智能合约 利用之前介绍过的一种合约范式可以将游戏中寻找解题方案的过程外包上链 因为求解数独问题的计算工作量会随着其行列数快速增长 实际上它也是一个 NP 完全 问题 不过我们可以借由 sCrypt
  • 整数溢出的漏洞危害和预防

    智能合约作为区块链2 0的代表技术 适应于区块链去中心化 分布式的特点 具有独立运行 不可篡改的优良特性 可用于实现包含金融工具在内的各类分布式应用 开发者可以自行定义交易逻辑并开发代码发布到链上 合约代码在矿工节点的虚拟机环境 如EVM
  • nodejs以太坊Dapp开发中文资料收集(精选版)

    区块链技术是趋势 会Nodejs 想做区块链相关 选择了以太坊这个平台 网上资料虽然多少能搜到 但是鱼龙混杂 重复错误百出 不够系统 在几天的搜寻筛选之后 整理了以下中文以太坊智能合约开发资料 有不足或者补充的请留言 互相交流共同进步 1
  • OpenZeppelin集成Truffle编写健壮安全的合约

    原文 http truffleframework com tutorials robust smart contracts with openzeppelin 因为智能合约往往涉及金钱 保证Soldity代码没有错误 以及足够的安全是非常根
  • ERC20智能合约-带销毁功能

    SPDX License Identifier MIT pragma solidity 0 8 0 dev Interface of the ERC20 standard as defined in the EIP interface IE
  • java和android程序员使用web3j进行区块链以太坊开发详解

    如何使用web3j为Java应用或Android App增加以太坊区块链支持 教程内容即涉及以太坊中的核心概念 例如账户管理包括账户的创建 钱包创建 交易转账 交易与状态 智能合约开发与交互 过滤器和事件等 同时也详细说明如何使用web3j

随机推荐

  • 【数据结构】有向无环图

    有向无环图 若一个有向图中不存在环 则称为有向无环图 简称DAG图 举例 比如有一棵树长这样 我们会发现它有重复的地方 将这两部分合并 还是有重复的地方 再次合并 总结规律 有向无环图中 未知变量不能重复 比如上例 只会有一个a b c d
  • Javascript基础第六天知识点以及案例:作用域、JS预解析、对象

    作用域目标 能够说出 JavaScript 的两种作用域 能够区分全局变量和局部变量 能够说出如何在作用域链中查找变量的值 1 作用域 1 1 作用域概述 通常来说 一段程序代码中所用到的名字并不总是有效和可用的 而限定这个名字的可用性的代
  • 慢速,混合和快速衰减模式。为什么我们要把事情复杂化?

    慢速 混合和快速衰减模式 为什么我们要把事情复杂化 如果你正在驱动感性负载 而它是有刷或无刷直流电机 步进电机 螺线管或继电器 你一定经历过一些问题 比如不需要的电流在不受欢迎的方向流动 如果你没有考虑到物理定律的这个事实 那么你有可能只有
  • caddy php h5ai,使用Docker快速安装H5ai网盘、内置HTML5视频播放器DPlayer

    说明 本镜像由iLemonrain大佬制作 使用的是LOC冻猫大佬修改的H5ai源码 其内置了HTML5视频播放器DPlayer 这里说下安装方法 安装 本镜像使用环境为Apache 2 4 PHP 7 1 1 安装Docker CentO
  • 每次都忘记:vscode把空格替换成换行符并换行显示

    勾选正则表达式 空格直接打 换行用 n
  • Cocos2d-x简单游戏<捕鱼达人>代码实现

    这个简单的捕鱼游戏Demo只是完成了简单的 1 场景切换 数据加载 武器等级更换 lt 大炮的升级 gt 2 鱼的随机游动 大炮发射子弹 撒网 捕鱼 3 子弹 鱼 网的碰撞检测等 4 场景及背景音乐的定时更换 碰撞时得音效 仅供参考 入门练
  • 100m光纤测速多少正常_光纤收发器的六个指示灯代表是什么意思?

    对光纤收发器这块了解的朋友应该知道 光纤收发器有6个LED指示灯 它们分别显示了收发器的工作状态 根据LED所示 我们就能判断出收发器是否工作正常和可能有什么问题 从而能帮助找出故障 那么 光纤收发器的六个指示灯分别代表什么意思 有哪些作用
  • 2015-2023年全球医疗器械公司100强(附细分领域排行)

    目录 2023全球医疗器械企业100强榜单 12家中国企业上榜 2022年度全球医疗器械公司100强排行榜 2021年全球医疗器械百强排行榜 2020年全球医疗器械企业100强公布 年份待定 2020全球医疗器械100强 2019年度全球医
  • JWT原理解析与实现

    1 Token与Session优缺点概述 1 1 Session的由来 在登录一个网站进行访问时由于HTTP协议是无状态的就是说一次HTTP请求后他就会被销毁 比如我在www a com login里面登录了 然后你就要访问别的了比如要访问
  • PicoDet论文译读笔记

    PP PicoDet A Better Real Time Object Detector on Mobile Devices 摘要 在目标检测中如何实现更好的精度 速度均衡是一个具有挑战性的问题 在本文中 作者致力于目标检测中关键组件的优
  • yolov6论文翻译

    摘要 多年来 YOLO系列一直是高效物体检测的事实上的工业级标准 YOLO社区以压倒性的优势丰富了它在众多硬件平台和丰富场景中的应用 在这份技术报告中 我们努力把它的极限推到一个新的水平 以坚定不移的心态向行业应用迈进 考虑到现实环境中对速
  • uniapp封装request请求

    在基础文件里面创建一个api文件 在创建两个 js文件 http js 里面封装 request 请求 let baseUrl https white 511 toponet cn 基地址 export const request opti
  • 头歌(C语言)-数据结构与算法-排序-第2关:实现快速排序

    任务描述 相关知识 编程要求 评测说明 任务描述 本关要求通过补全快速排序私有函数QSort 来供函数QuickSort调用 以此来实现快速排序的功能 相关知识 快速排序的基本过程是 从待排序记录中任选一个记录 以它的排序码作为中心值 将其
  • 关于单链表的函数

    关于单链表一些基础功能函数的总结 文章目录 关于单链表一些基础功能函数的总结 0 这个链表的结构体 1 输出单链表 2 创建单链表 头插法 3 链表 其中一个 的删除 4 链表的插入 5 单链表的快排 6 单链表变成循环链表 尾节点连上头结
  • 《Vision-Language Pre-Training with Triple Contrastive Learning》/《具有三重对比学习的视觉语言预训练》

    一 摘要 视觉语言表示学习很大程度上受益于通过对比损失 例如 InfoNCE损失 的图像 文本对齐 这种对齐策略能够最大化图像与其匹配文本之间的互信息 MI 然而 简单地执行跨模态对齐 CMA 不能确保来自相同模态的相似输入保持接近 这可能
  • Greenplum元数据信息

    1 元数据重要的表 pg database 所有的数据库信息 pg namespace 所有的schema信息 pg class 所有的表信息 pg attribute 所有的属性信息 pg proc 函数信息 包括自定义函数 以上都可以以
  • spec文件说明

    spec文件概述 spec文件中主要包含4个class Analysis PYZ EXE和COLLECT Analysis以py文件为输入 它会分析py文件的依赖模块 并生成相应的信息 修改的主要是这个部分 PYZ是一个 pyz的压缩包 包
  • #循循渐进学51单片机#定时器与数码管#not.4

    1 熟练掌握单片机定时器的原理和应用方法 1 时钟周期 单片机时序中的最小单位 具体计算的方法就是时钟源分之一 2 机器周期 我们的单片机完成一个操作的最短时间 3 定时器 打开定时器 储存寄存器 的值经过一个机器周期自动加一 也就是说 机
  • 常用文件读写&CSV文件读写&对象的序列化和反序列化

    前言 意识 python中一切皆是对象 常见文件的读写分类 1 普通文本文件 txt py md html doc等 2 二进制文件 图片 音频 视频 压缩包等 3 csv文件 csv 需要借助于系统模块csv 4 对象的序列化和反序列化
  • 使用 sCrypt 实现数独游戏合约

    我们在 BSV 区块链上实现了一个数独游戏智能合约 利用之前介绍过的一种合约范式可以将游戏中寻找解题方案的过程外包上链 因为求解数独问题的计算工作量会随着其行列数快速增长 实际上它也是一个 NP 完全 问题 不过我们可以借由 sCrypt