使用 sCrypt 实现定期支付合约

2023-11-04

这里我们介绍一个定期支付合约,允许用户定期存入款项,并且收款者可以定期收取款项。

subscription

合约实现

合约代码如下:


contract Recurring {
    Ripemd160 userPubKeyHash; //Address of the owner of the coin
    int merchantPayment; //How much the merchant can take from the contract
    Ripemd160 merchantPubKeyHash; //Address of the merchant
    int frequenceOfPayment; //Merchant can take money each "frequenceOfPayment" seconds

    // User can deposit more money in his recurring contract
    public function deposit_user(SigHashPreimage preImage, int depositAmount, int changeAmount) {
        require(Tx.checkPreimage(preImage));
        require(depositAmount > 0);
        int contractTotalAmount = SigHash.value(preImage) + depositAmount;
        bytes output = Utils.buildOutput(SigHash.scriptCode(preImage), contractTotalAmount);
        bytes change_output = changeAmount <= 546 ? b'' : Utils.buildOutput(Utils.buildPublicKeyHashScript(this.userPubKeyHash), changeAmount);
        require(hash256(output + change_output) == SigHash.hashOutputs(preImage));
    }

    // User wants to withdraw its money. Standard P2PKH transaction
    public function withdraw_user(Sig sig, PubKey pubKey) {
        require(hash160(pubKey) == this.userPubKeyHash);
        require(checkSig(sig, pubKey));
    }

    // Merchant wants its money
    public function withdraw_merchant(SigHashPreimage preImage, int newAmount) {
        require(Tx.checkPreimage(preImage));
        //Output for the merchant
        bytes outputMerchant = Utils.buildOutput(Utils.buildPublicKeyHashScript(this.merchantPubKeyHash), this.merchantPayment);
        //Output that'll be the next instance of the contract
        //Check nlocktime
        bytes scriptCode = SigHash.scriptCode(preImage);
        int scriptLen = len(scriptCode);
        bytes codePart = this.getCodePart(scriptCode, scriptLen);
        int newMatureTime = this.getPrevMatureTime(scriptCode, scriptLen) + this.frequenceOfPayment;
        bytes newScript = codePart + pack(newMatureTime);
        require(SigHash.nLocktime(preImage) == newMatureTime);
        //Build the output
        bytes outputContract = Utils.buildOutput(newScript, newAmount);
        require(hash256(outputContract + outputMerchant) == SigHash.hashOutputs(preImage));
    }

    function getPrevMatureTime(bytes lockingScript, int scriptLen) : int {
        return unpack(lockingScript[scriptLen - 4 :]);
    }

    function getCodePart(bytes lockingScript, int scriptLen) : bytes {
        return lockingScript[0 : scriptLen - 4];
    }
}

该合约有3个公共函数:

  • 第一个允许用户存入更多的钱;
  • 第二个允许用户随时选择退出。 请注意,如果用户需要在停止重复付款之前提供取消通知给商家,可以基于此合约进行些小的修改而实现;
  • 最后一个允许商家定期从合约中提取一定数量的钱。 它包含一个nLockTimeVerify 部分,以防止商家立即提取它。另请注意,nLockTimeVerify 仅适用于商家,用户仍可以存入更多资金或选择退出。

应用场景

此合约除了对于订阅付款非常有用以外,其设计思路也可以用于实现很多支付帐户的功能,例如:每天有支出限额;或者如果手机被盗会紧急关闭;有取款密码;支付时需要满足特殊条件等应用场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 sCrypt 实现定期支付合约 的相关文章

  • conflux.web3j.RpcException:data = “\“network prefix inconsistent in from(net999) and to(cfxtest)\““

    java conflux sdk报错 SLF4J Failed to load class org slf4j impl StaticLoggerBinder SLF4J Defaulting to no operation NOP log
  • Solidity transfer,call和send 的区别

    address transfer throws on failure forwards 2 300 gas stipend not adjustable safe against reentrancy should be used in m
  • Web3 用例全解析:传统品牌加速进入 Web3 的原因?

    Web3 有能力彻底改变品牌和客户相互联系的方式 许多品牌已经在尝试使用 NFT 和元宇宙来提高品牌知名度和消费者忠诚度 这是传统社交媒体和电子商务渠道根本无法做到的 NIKE Panini 和 Vodafone nbsp 是最早认识到 N
  • 以太坊的企业系统集成

    最流行的开源Java集成库 Apache Camel现在支持以太坊的JSON RPC API 以太坊生态系统 以太坊是一个开源 公共 区块链平台 用于运行智能合约 它提供了一个去中心化的图灵完备虚拟机 可以执行脚本和加密货币 用于补偿参与者
  • Solidity 合约安全,常见漏洞 (下篇)

    Solidity 合约安全 常见漏洞 下篇 Solidity 合约安全 常见漏洞 上篇 不安全的随机数 目前不可能用区块链上的单一交易安全地产生随机数 区块链需要是完全确定的 否则分布式节点将无法达成关于状态的共识 因为它们是完全确定的 所
  • Moonbeam路由流动性

    Moonbeam路由流动性 Moonbeam Routed Liquidity MRL 使加密资产流动性能够从其他生态系统 如以太坊 Solana Polygon或Avalanche 进入波卡生态系统 借助MRL 用户可以通过简洁的用户体验
  • 区块链之java(一) 番外篇(数据类型)

    预先善其事 必先利其器 今天俺们讲讲智能合约和java中的一个数据类型 在智能合约中 大概有这些基本类型 能满足开发 是否有漏的呢 我也不太清楚 因为我也没有很深入的了解这块 好了 话不多说 看看具体的东西 智能合约类型如下 uint256
  • 区块链技术关键词

    区块链技术 区块链是一种分布式账本技术 通过将数据以区块的形式依次链接在一起 并使用密码学技术保证安全性和一致性 加密货币 加密货币是基于区块链技术的数字资产 例如比特币 Bitcoin 和以太坊 Ethereum 等 它们使用区块链来记录
  • 莱昂哈德·欧拉生平及其成就简介

    莱昂哈德 欧拉 Leonhard Euler 1707年4月15日 1783年9月18日 瑞士数学家 自然科学家 1707年4月15日出生于瑞士的巴塞尔 1783年9月18日于俄国圣彼得堡去世 欧拉出生于牧师家庭 自幼受父亲的影响 13岁时
  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型 重点是值类型 包括布尔类型 整型 地址类型 字节类型 字符串类型和枚举类型 并且通过两个智能合约例子 用于演示这些数据类型的声明与使用方法 访问 Github 仓库 获取更多资料 基本概念 Sol
  • 使用 sCrypt 实现一个简单的 NFT 合约

    我们之前的token方案针对的是可替换 fungible 的 token 这里来看看另一种方案如何实现 NFT non fungible token 合约 这类 token 可以代表独一无二的和不可分割的资产 比如房地产和收藏品 概览 与可
  • 你认为DAO是否可行?新年计划,卯足干劲,兔必No.1

    文章目录 课前小差 聚沙成塔 社会价值 DAO是什么 国产化 商业化回报 写在最后 课前小差 哈喽 大家好 我是几何心凉 这是一份全新的专栏 唯一得倒CSDN王总的授权 来对于我们每周四的绿萝时间 直达CSDN 直播内容进行总结概括 让大家
  • 搭建第一个Dapp应用(4)——搭建SmartDev-Scaffold——2021.5.3

    搭建第一个Dapp应用 4 搭建SmartDev Scaffold 一丶环境配置 Java gt JDK 1 8 Solidity 0 4 25 Git 下载安装包需要使用Git Gradle 大于6 小于7 使用gradle7会报错 二丶
  • Node.js web3.js编译、部署智能合约

    Node js web3 js编译 部署智能合约 供参考脚本 https github com Saturday24 Smart Contracts Script 1 编译脚本 a install web3 solc fs path b 编
  • Truffle测试框架

    Truffle测试框架 Truffle 有一个标准的自动化测试框架 让你可以非常方便地测试您的合约 这个框架允许您以两种不同的方式编写简单可控的测试 1 在 JavaScript中 用于执行来自外部世界的合约 就像您的应用程序一样 2 在
  • 区块链学习5:智能合约Smart contract原理及发展历程科普知识

    前往老猿Python博文目录 一 智能合约的定义 通俗来说 智能合约就是一种在计算机系统上 当一定条件满足的情况下可被自动执行的合约 智能合约体现为一段代码及其运行环境 例如银行信用卡的自动还款就是一种典型的智能合约 我们来看看智能合约概念
  • 深入理解Solidity——作用域和声明

    作用域和声明 Scoping and Declarations 已声明的变量将具有其字节表示为全0的初始值 变量的初始值是任何类型的典型 零状态 zero state 例如 bool的初始值为false uint或int类型的默认值为0 对
  • 【0基础】学习solidity开发智能合约-初识solidity

    本篇课程开始 我们来学习一下如何使用solidity开发智能合约 由于博主对于solidity的学习 也是自学的 所以一些不足或有纰漏之处还望指出 大家共同进步 本系列课程会分很多节课讲述 从入门到进阶 实战 在课程最后 我们会通过所学知识
  • 浅谈以太坊智能合约的设计模式与升级方法

    浅谈以太坊智能合约的设计模式与升级方法 1 最佳实践 2 实用设计案例 2 1 控制器合约与数据合约 1 gt 1 2 2 控制器合约与数据合约 1 gt N 2 3 控制器合约与数据合约 N gt 1 2 4 控制器合约与数据合约 N g
  • Sidetree - 去中心化身份管理协议

    身份 Identity 管理是区块链应用的核心元素 在一个不可信 匿名的分布计算生态中 要实现去中心化身份管理并不是一件容易的事情 Sidetree是一个基于现有区块链平台的第二层 L2s 协议 专门用于去中心化身份管理 微软最新开源的IO

随机推荐

  • Vue——vue3报错 <Suspense> slots expect a single root node.

    解决 如果有多组件嵌入时需要给每个组件一个 div 标签
  • springboot最新稳定版本、springcloud对应版本的选择

    1 登录springboot官网 查看当前最稳定版本 https spring io projects spring boot learn 可以看到目前为止最稳定的最新版本是2 4 0 2 登录springcloud官网 查看当前最新的稳定
  • 鸿蒙系统应用开发入门HelloWord(DevEco Studio怎么启动项目以及程序的运行过程)

    使用DevEco Studio新建项目之后 会自带HelloWorld 其他语言需要我们自己写 由于项目使用的模拟器不是在我们本地 而是部署在华为的服务器中 所以我们需要登录华为账号并实名认证才可以使用 登录并启动项目 DevEco Stu
  • JAX-RS (REST Web Services) 2.0 requires Java 1.6 or newer.

    maven 项目出现JAX RS REST Web Services 2 0 requires Java 1 6 or newer 错误 解决办法 这个是eclipse的bug 可见这个链接 https bugs eclipse org b
  • Eclipse中使用SVN

    我的个人博客地址 opiece me 欢迎大家的访问 1 在Eclipse里下载Subclipse插件 方法一 从Eclipse Marketplace里面下载 具体操作 打开Eclipse gt Help gt Eclipse Marke
  • 从0实现基于Linux socket聊天室-增加数据库功能-5

    之前更新过从0实现聊天室的4篇文章 很多粉丝朋友还是觉得内容相对简单 本文一口君会在原有代码基础上增加数据库操作功能 后续文章还会增加文件传输功能 前面文章链接 从0实现基于Linux socket聊天室 多线程服务器模型 1 从0实现基于
  • 卷积的利用

    视频 https www bilibili com video BV1vE411h7W2 from search seid 14520040502419023311 卷积 https www bilibili com video BV1A4
  • Java 8 lambda 函数式编程

    目录 简介 Lambda 表达式 解析1 解析2 自定义 lambda 表达式 例子1 一行输出多个值 例子2 数值计算 例子3 函数中使用自定义lambda表达式 简介 函数式编程就是类似于这样的东西 class MyTest publi
  • 运维攻城狮面试题汇总

    面试题汇总 什么是运维 什么是游戏运维 1 运维是指大型组织已经建立好的网络软硬件的维护 就是要保证业务的上线与运作的正常 在他运转的过程中 对他进行维护 他集合了网络 系统 数据库 开发 安全 监控于一身的技术 运维又包括很多种 有DBA
  • Qt响应按键按下

    1 Qt的键盘事件 void keyReleaseEvent QKeyEvent 按键释放事件 void keyPressEvent QKeyEvent 按键按下事件 2 Qt可以响应的按键事件 单个按键 组合键 例如 crtl c 注意
  • 如何用Python进行股票预测,数据分析带你从小白开始

    在开始这个话题之前请先记住一句友情提醒 股市有风险 投资需谨慎 我们写这个文章并不是鼓励大家去入市 小编本人也不买股票 我们只是在探索Python在股票分析和预测上面能发挥什么样的作用 对于和数据打交道的数据科学家来说 预测证券市场走势远比
  • C语言常见错误分析

    C语言常见错误分析 错误分类 语法错 逻辑错 运行错 0 忘记定义变量 main x 3 y 6 printf d n x y 1 C语言的变量一定要先定义才能使用 2 输入输出的数据的类型与所用格式说明符不一致 int a 3 float
  • PRML_频率与贝叶斯(一)

    我们从数据中能得到以下信息 总体信息 总体所属分布或者所属的分布族带来的信息 样本信息 从总体中抽样得来的样本给我们提供的信息 以上两种信息进行的统计推断称为经典统计学 它的观点是把样本看成来自具有一定概率分布的总体 先验信息 在抽样之前
  • Echarts.js(二):多系列柱状图

    多系列柱状图大部分与多系列折线图相似 一 简单html布局 简单的html如下
  • SqlServer分页查询

    文章目录 这篇博客讲的是SQL server的分页方法 用的SQL server 2012版本 下面都用pageIndex表示页数 pageSize表示一页包含的记录 并且下面涉及到具体例子的 设定查询第2页 每页含10条记录 首先说一下S
  • 写出质量好软件的75条体会

    1 你们的项目组使用源代码管理工具了么 MVM 应该用 VSS CVS PVCS ClearCase CCC Harvest FireFly都可以 我的选择是VSS 郁也风 公司使用的是VSS 在网上与朋友玩的就是CVS了 咖啡 现在都在用
  • 领域驱动设计:领域事件

    文章目录 领域事件 识别领域事件 领域事件相关案例 领域事件总体架构 领域事件 领域事件是领域模型中非常重要的一部分 用来表示领域中发生的事件 一个领域事件将导致进一步的业务操作 在实现业务解耦的同时 还有助于形成完整的业务闭环 举例来说的
  • 【因子算法】——求一个数的因子、质因子、求两个数的公因子

    下面理清楚一些数学概念 因数 一个数 如果存在可以被它整除的数 则这些数都是该数的因数 规定0没有因数 1的因数是1 其他的比如4的因数有 1 2 4 因子 一个数 如果存在可以被它整除的数且这些数不包括它本身 则这些书都是该数的因子 规定
  • 异常处理:System.Xml.XmlException_缺少根元素

    System Xml XmlException 类型的未处理的异常在System Xml dll中发生 其他 缺少根元素 问题背景 可能是因为强制断电 导致电脑里文件出错 原本运行正常的程序出现报错 缺少根元素 处理方法 删除C Users
  • 使用 sCrypt 实现定期支付合约

    这里我们介绍一个定期支付合约 允许用户定期存入款项 并且收款者可以定期收取款项 合约实现 合约代码如下 contract Recurring Ripemd160 userPubKeyHash Address of the owner of