• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    比特币上的数独游戏合约的实现代码

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

    sCrypt 合约代码如下:

    import "util.scrypt";
    import "array.scrypt";
    
    contract Sudoku {
    
     bytes board;
    
     static const int N = 9;
     static bytes EMPTY = b'00';
    
     constructor(bytes board) {
      this.board = board;
     }
    
     function merge(bytes solution) : bytes {
      bytes newBoard = this.board;
      int i = 0;
      loop (N) {
       int j = 0;
       loop (N) {
    
        int value = this.readValue(newBoard, i, j);
        int inputValue = this.readValue(solution, i, j);
        if (value == 0) {
         require(inputValue = 9);
         newBoard = this.setValue(newBoard, i, j, inputValue);
        } else {
         require(value == inputValue);
        }
        j++;
       }
    
       i++;
      }
      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();
    
      int i = 0;
      loop (N) {
       int j = 0;
    
       loop (N) {
        // check for duplicate
    
        // in a row
        int rowElem = this.readValue(newBord, i, j);
        require(rowArray.indexOf(rowElem) == -1);
        rowArray.push(rowElem);
    
        // in a column
        int colElem = this.readValue(newBord, j, i);
        require(colArray.indexOf(colElem) == -1);
        colArray.push(colElem);
    
        // in a subgrid
        int squareElem = this.readSquareValue(newBord, i, j);
        require(squareArray.indexOf(squareElem) == -1);
        squareArray.push(squareElem);
    
        j++;
       }
    
       rowArray.clear();
       colArray.clear();
       squareArray.clear();
    
       i++;
      }
    
      require(true);
     }
    
     static function readValue(bytes board, int i, int j): int {
      return Util.fromLEUnsigned(Util.getElemAt(board, Sudoku.index(i, j)));
     }
    
     static function setValue(bytes board, int i, int j, int value): bytes {
      return Util.setElemAt(board, this.index(i, j), Util.toLEUnsigned(value, 1));
     }
    
     static function readSquareValue(bytes board, int i, int j): int {
      return Util.fromLEUnsigned(Util.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);
     }
    }

    到此这篇关于比特币上的数独游戏合约的实现代码的文章就介绍到这了,更多相关比特币数独游戏合约内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • python程序实现BTC(比特币)挖矿的完整代码
    • C++实现比特币系统的源码
    • Python实现类似比特币的加密货币区块链的创建与交易实例
    • C++实现区块链的源码
    • Go语言开发区块链只需180行代码(推荐)
    • JavaScript实现区块链
    • 普通人如何在区块链行业赚钱
    • 使用go实现简易比特币区块链公链功能
    上一篇:关于idea+centos7+zookeeper报错connectionloss,timeout问题
    下一篇:Prometheus的安装和配置教程详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    比特币上的数独游戏合约的实现代码 比特,币,上,的,数独,游戏,