以太坊微支付通道原理与实现

区块链支付通道:原理、实现与闪电网络实战解析 区块链技术中的可扩展性一直是核心挑战,尤其在支付场景下,链上共识机制导致交易处理速度受限。支付通道作为一种Layer 2扩容方案,通过将大量高频交易转移至链下处理,仅将最终净额结算上链,实现了交易速度的飞跃。其技术原理基于密码学签名和状态更新机制,结合哈希时间锁合约(HTLC)等技术,构建出双向乃至多向的安全支付网络。这种设计不仅大幅提升了吞吐量,降低了交易成本,还为微支付、实时结算等场景提供了可行基础。以比特币闪电网络和以太坊Raiden Network为代表的支付通道网络,正通过解决路由发现、流动性管理 阅读详情

以太坊微支付通道原理与实现

线上直接转账需要一定的费用,如果存在大量小额交易的情况下,费用会变的难以承受,因而以太坊引入了微交易支付通道来解决这个问题。以太坊提供了一个票据支付方案,主要依赖于智能合约实现的一对多的账单系统。该账单系统大致上的执行流程如下.

  • 1:账单生成,同时提供机制往账单上存入保证金。

  • 2:交易发起人生成交易票据

  • 3:直接将票据发送给接收人

  • 4:接收人兑现票据,从合约转账(尽管某次兑现可能会失败,但是只要票据存在最终还是能够兑现).

这种交易优点在于可以在线下发送任意数量的交易,而只需要两个链上交易(存入保证金,兑现)只要存入保证金,线下通过交换票据进行任意数量的交易,避免了频繁的线上转账,节省了交易费用。

代码结构

.
├── api.go                             //对外接口
├── cheque.go                          //账单
├── cheque_test.go
├── contract       
│   ├── chequebook.go                  //合约go语言接口
│   ├── chequebook.sol                 //合约源码
│   ├── code.go                        //合约byte码
│   ├── mortal.sol                     //合约销毁
│   └── owned.sol                      //hebe权限
└── gencode.go                         //合约byte码生成

合约层

合约自身是接收转账的,用户可以在初始化或者后来增加金额,可以通过cash方法兑现票据,转账金额都会保存在send变量上。

    pragma solidity ^0.4.18;

    import "./mortal.sol";

    /// @title Chequebook for Ethereum micropayments
    /// @author Daniel A. Nagy <daniel@ethereum.org>
    contract chequebook is mortal {
        // Cumulative paid amount in wei to each beneficiary
        //已经支付的 可以控制双花,防止多次兑换票据
        mapping (address => uint256) public sent;

        /// @notice Overdraft event
        event Overdraft(address deadbeat);

        // Allow sending ether to the chequebook.
        function() public payable { }

        /// @notice Cash cheque
        ///
        /// @param beneficiary beneficiary address
        /// @param amount cumulative amount in wei
        /// @param sig_v signature parameter v
        /// @param sig_r signature parameter r
        /// @param sig_s signature parameter s
        /// The digital signature is calculated on the concatenated triplet of contract address, beneficiary address and cumulative amount
        function cash(address beneficiary, uint256 amount, uint8 sig_v, bytes32 sig_r, bytes32 sig_s) public {
            // Check if the cheque is old.
            // Only cheques that are more recent than the last cashed one are considered.
            require(amount > sent[beneficiary]);
            // Check the digital signature of the cheque.
            bytes32 hash = keccak256(address(this), beneficiary, amount);
            require(owner == ecrecover(hash, sig_v, sig_r, sig_s));
            // Attempt sending the difference between the cumulative amount on the cheque
            // and the cumulative amount on the last cashed cheque to beneficiary.
            uint256 diff = amount - sent[beneficiary];
            if (diff <= this.balance) {
                // update the cumulative amount before sending
                sent[beneficiary] = amount;
                beneficiary.transfer(diff);
            } else {
                // Upon failure, punish owner for writing a bounced cheque.
                // owner.sendToDebtorsPrison();
                Overdraft(owner);
                // Compensate beneficiary.
                selfdestruct(beneficiary);
            }
        }
    }

支付层

账单保存了账本的位置,记账人,所有人等信

    // Chequebook can create and sign cheques from a single contract to multiple beneficiaries.
    // It is the outgoing payment handler for peer to peer micropayments.
    type Chequebook struct {
        path     string                      // path to chequebook file
        prvKey   *ecdsa.PrivateKey           // private key to sign cheque with
        lock     sync.Mutex                  //
        backend  Backend                     // blockchain API
        quit     chan bool                   // when closed causes autodeposit to stop
        owner    common.Address              // owner address (derived from pubkey)
        contract *contract.Chequebook        // abigen binding
        session  *contract.ChequebookSession // abigen binding with Tx Opts

        // persisted fields
        balance      *big.Int                    // not synced with blockchain
        contractAddr common.Address              // contract address
        sent         map[common.Address]*big.Int //tallies for beneficiaries

        txhash    string   // tx hash of last deposit tx
        threshold *big.Int // threshold that triggers autodeposit if not nil
        buffer    *big.Int // buffer to keep on top of balance for fork protection

        log log.Logger // contextual logger with the contract address embedded
    }

票据:合约位置,接收人,金额,签名

    type Cheque struct {
        Contract    common.Address // address of chequebook, needed to avoid cross-contract submission
        Beneficiary common.Address
        Amount      *big.Int // cumulative amount of all funds sent
        Sig         []byte   // signature Sign(Keccak256(contract, beneficiary, amount), prvKey)
    }

票据生成

生成一条支付记录,返回一份签名后的票据,收费这凭借这张票据从合约里面取钱.

    // Issue creates a cheque signed by the chequebook owner's private key. The
    // signer commits to a contract (one that they own), a beneficiary and amount.
    func (self *Chequebook) Issue(beneficiary common.Address, amount *big.Int) (ch *Cheque, err error) {
        defer self.lock.Unlock()
        self.lock.Lock()

        if amount.Sign() <= 0 {
            return nil, fmt.Errorf("amount must be greater than zero (%v)", amount)
        }
        if self.balance.Cmp(amount) < 0 {
            err = fmt.Errorf("insufficient funds to issue cheque for amount: %v. balance: %v", amount, self.balance)
        } else {
            var sig []byte
            sent, found := self.sent[beneficiary]
            if !found {
                sent = new(big.Int)
                self.sent[beneficiary] = sent
            }
            sum := new(big.Int).Set(sent)
            sum.Add(sum, amount)

            sig, err = crypto.Sign(sigHash(self.contractAddr, beneficiary, sum), self.prvKey)
            if err == nil {
                ch = &Cheque{
                    Contract:    self.contractAddr,
                    Beneficiary: beneficiary,
                    Amount:      sum,
                    Sig:         sig,
                }
                sent.Set(sum)
                self.balance.Sub(self.balance, amount) // subtract amount from balance
            }
        }

        // 账单余额少于阈值,自动补充.
        if self.threshold != nil {
            if self.balance.Cmp(self.threshold) < 0 {
                send := new(big.Int).Sub(self.buffer, self.balance)
                self.deposit(send)
            }
        }

        return
    }

存储金额

    func (self *Chequebook) Deposit(amount *big.Int) (string, error) {
        defer self.lock.Unlock()
        self.lock.Lock()
        return self.deposit(amount)
    }

    func (self *Chequebook) deposit(amount *big.Int) (string, error) {
        // since the amount is variable here, we do not use sessions
        depositTransactor := bind.NewKeyedTransactor(self.prvKey)
        depositTransactor.Value = amount
        chbookRaw := &contract.ChequebookRaw{Contract: self.contract}
        //转入金额
        tx, err := chbookRaw.Transfer(depositTransactor)
        if err != nil {
            self.log.Warn("Failed to fund chequebook", "amount", amount, "balance", self.balance, "target", self.buffer, "err", err)
            return "", err
        }
        // assume that transaction is actually successful, we add the amount to balance right away
        self.balance.Add(self.balance, amount)
        self.log.Trace("Deposited funds to chequebook", "amount", amount, "balance", self.balance, "target", self.buffer)
        return tx.Hash().Hex(), nil
    }

兑换票据

// Cash is a convenience method to cash any cheque.
func (self *Chequebook) Cash(ch *Cheque) (txhash string, err error) {
	return ch.Cash(self.session)
}

// Cash cashes the cheque by sending an Ethereum transaction.
func (self *Cheque) Cash(session *contract.ChequebookSession) (string, error) {
	v, r, s := sig2vrs(self.Sig)
    //调用合约的cash方法 提取代币
	tx, err := session.Cash(self.Beneficiary, self.Amount, v, r, s)
	if err != nil {
		return "", err
	}
	return tx.Hash().Hex(), nil
}

其他接口

OutBox:用于在电对点网络中发行票据,提供了保证金存入,票据发行,自动存入保证金等接口。

    type Outbox struct {
        chequeBook  *Chequebook
        beneficiary common.Address
    }

    // Issue creates cheque.
    func (self *Outbox) Issue(amount *big.Int) (swap.Promise, error) {
        return self.chequeBook.Issue(self.beneficiary, amount)
    }

    // AutoDeposit enables auto-deposits on the underlying chequebook.
    func (self *Outbox) AutoDeposit(interval time.Duration, threshold, buffer *big.Int) {
        self.chequeBook.AutoDeposit(interval, threshold, buffer)
    }

InBox:用于在电对点网络中票据兑换,提供了直接兑换,定时兑换,延迟兑换的接口功能。

    // Inbox can deposit, verify and cash cheques from a single contract to a single
    // beneficiary. It is the incoming payment handler for peer to peer micropayments.
    type Inbox struct {
        lock        sync.Mutex
        contract    common.Address              // peer's chequebook contract
        beneficiary common.Address              // local peer's receiving address
        sender      common.Address              // local peer's address to send cashing tx from
        signer      *ecdsa.PublicKey            // peer's public key
        txhash      string                      // tx hash of last cashing tx
        session     *contract.ChequebookSession // abi contract backend with tx opts
        quit        chan bool                   // when closed causes autocash to stop
        maxUncashed *big.Int                    // threshold that triggers autocashing
        cashed      *big.Int                    // cumulative amount cashed
        cheque      *Cheque                     // last cheque, nil if none yet received
        log         log.Logger                  // contextual logger with the contract address embedded
    }

    // Cash attempts to cash the current cheque.
    func (self *Inbox) Cash() (txhash string, err error) {
        if self.cheque != nil {
            txhash, err = self.cheque.Cash(self.session)
            self.log.Trace("Cashing in chequebook cheque", "amount", self.cheque.Amount, "beneficiary", self.beneficiary)
            self.cashed = self.cheque.Amount
        }
        return
    }

转自:(魂祭心) https://my.oschina.net/hunjixin/blog/1807446

如果你希望高效的学习以太坊DApp开发,可以访问汇智网提供的最热门在线互动教程:

1.适合区块链新手的以太坊DApp实战入门教程
2.区块链+IPFS+Node.js+MongoDB+Express去中心化以太坊电商应用开发实战

其他更多内容也可以访问这个以太坊博客


快速了解Spyder 一 面板介绍菜单栏:放置所有功能工具栏:放置快捷菜单,可以通过菜单栏中的View的Toolbars的复选框来勾选工作区:写代码的地方属性页的标题栏:可以显示当前代码的名字和位置查看栏:查看文件、调试时的对象及变量输出栏:查看程序的输出信息,也可以作为shell终端来输入Python语句状态栏:用来显示当前文件权限、编码,光标指向位置和系统内存二 注释功能注释功能为编写代码很常用功能,下面介绍Spy... 阅读详情

相关推荐

全志T113 Tina5.0开发:(一)添加自己的板级支持包

3.验证 先执行 source build/envsetup.sh ,然后lunch,下图可见9就是我们自己添加的板子。2. 1)修改 t113-evb1.mk重命名为t113-ws_devboard。我使用的spinand,只需要修改openwrt里面的文件即可。以下内容仅作为自己笔记,如果错误欢迎留言指出。修改t113-ws_devboard。

u014428915的博客 1163

闪电网络的起源-----微支付通道的原理及缺点

写在前面:以前写过一个微支付通道的原理的博客,大家往前翻应该能找到,但是那是纯从协议的角度去说,写的时候也是不是特别理解,这次重看了火币研究院关于闪电网络的白皮书,对于这些概念协议有了新的理解,重新写下这篇博客。 闪电网络微支付通道的安全性技术原理 “ifalltreefallsintheforestandnooneisaroundtohearit,doesitmakeasound”--GeorgeBerkely 就像无人听闻的陨落无足轻重一样,日常重复的交易也不...

zr1213159840的博客 664

手机移动端-纯js浏览器h5调用摄像头扫描识别解析 条形码+二维码

一、场景 h5原生js 浏览器端解决识别二维码条形码功能; 不借助Hbuilder.需要自己打包成APP,比如用Hbuilder打包,浏览器端项目h5无打包成app部署X不采用 不借助微信扫一扫,调用微信js-jdk有多麻烦,还要认证服务号,也不适用其它浏览器打开X不采用 二、思路 1.思路一:input(相机拍照)+条形码或二维码识别js支持库 通过h5-input[camera]调用相机进行拍照成图片,通过条形码等识别库解析出数据; <input @cha...

徐子厚的博客 3万+

【区块链开发入门】(二) 以太坊的编程接口

目录一、web3.js API1. 安装web3.js并创建实例 go-ethereum私有链搭建完成后,可以通过以下三种方式与区块链交互: JavaScript Console:在geth控制台与以太坊交互。 JSON-RPC:一种无状态、轻量级的远程过程调用协议,可以跨语言调用。 web3.js:web3.js是以太坊提供的一个javascript库,它封装了以太坊的JSON-RPC API,提供了一系列与区块链交互的javascript对象和函数。 这里主要介绍后面两种交互方式。 一、web3.j

Famidlistimo的博客 2849

Ubuntu 22.04 上 Mezzanine CMS 完整安装指南

CMS(内容管理系统)是构建博客、企业官网等静态与动态内容混合站点的核心技术栈;Django 作为 Python 生态中最成熟的 Web 框架,凭借其 ORM、Admin 和安全机制,成为 CMS 开发的首选基础。Mezzanine 是基于 Django 的轻量级 CMS,以开箱即用、零配置多语言和内置 SEO 工具为特色,特别适合中小项目快速落地。在 Ubuntu 这类强调稳定性的服务器操作系统上部署时,关键挑战并非代码逻辑,而是系统层依赖协同——如 Python 版本锁定、SQLite FTS5 支持、

weixin_33508411的博客 304

如何在huggingface上申请下载使用llama2/3模型

huggingface-cli download --resume-download 模型名称 --local-dir 存放模型的位置 --local-dir-use-symlinks False --resume-download --token token序列号xxxxxxx。登录huggingface,在模型详情页面上,找到这个表单,填写内容,提交申请。需要使用梯子,country填写梯子的位置吧(比如美国)等待一小时左右,会有邮件通知。

a61022706的博客 1万+

用 Web3 以太坊接口连接与操作 MetaMask 开发指南

本文用一个例子,演示了如何使用 window.ethereum 对象连接并操作 MetaMask 钱包的方法。MetaMask 是一个浏览器插件钱包,支持火狐浏览器和谷歌浏览器。插件安装完成后,window 对象中会出现一个 window.ethereum 的对象。

StevenX5 6074

arcgis select by attributes一次选多个_视频:如何基于ArcGIS与GeoDa求莫兰指数和绘制莫兰散点图?...

莫兰指数是全域莫兰指数(Global Moran's I)的简称,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(Patrick Alfred Pierce Moran),在1950年提出的。详细介绍,如下:莫兰指数取值范围在-1.0至1.0之间。当Moran's I >0时,表示空间正相关性,其值越大,空间相关性越明显;当Moran's I <0时,表示空间负相关性...

weixin_39948247的博客 1759

以太坊 api php,Php如何调用以太坊接口

以太坊规定了每个节点需要实现的JSON RPC应用开发接口,如果希望使用PHP开发一个以太坊区块链 上的去中心化应用(DApp),首先要解决的问题就是如何使用PHP调用以太坊JSON RPC接口: 如果你希望将网站快速接入以太坊,例如支持以太币支付,或者发行自己的代币,那么这个 Php以太坊开发详解课程提供了最佳的学习路径。虽然接口规范并没有对传输层进行约定,但大多数以太坊节点软件都实现了对HTT...

weixin_42299032的博客 636

机器学习项目实战案例数据集

本专栏整理了《机器学习项目实战案例》,内包含了各种不同的机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 3633

Java小白入门200例81之Java接口

作者简介 作者名:编程界明世隐 简介:优快云博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞! 引言 很多Java初学者问我,新手明明很用心、很努力学习的Java知识,转头又忘记了,很让人犯愁,小白如何能够快速成长、成为大牛呢? 其实要成为大神的技巧只有一个:“多学多练”,于是明哥就整理了比较典型的练习实例,通过练习能够快速提升编码技巧和熟练度,让你在成为大

编程界明世隐的博客 1358

雷电网络 微支付通道

1 微支付通道搭建: http://blog.hubwiz.com/2018/08/18/ethereum-payment-channel/ 简易微支付通道搭建 https://ethfans.org/posts/counterfactual-for-dummies-part-1 counterfactual系列文章 https://learnblockchain.cn/docs/...

yanyanho的专栏 357

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

以太坊状态通道技术:原理、实现与高频交易优化

状态通道作为区块链二层扩容的核心技术,通过将交易移至链下执行、关键环节链上仲裁的混合架构,实现了吞吐量从15TPS到3000+TPS的飞跃。其技术原理基于多重签名托管、状态证明签名和争议期机制,在保持去中心化特性的同时,将微支付延迟压缩至300毫秒级,gas成本降低90%以上。这种设计特别适合DeFi高频交易、NFT实时买卖和链游交互等场景,典型应用包括DEX做市商报价优化(价差缩小60%)和游戏道具秒级交易。Solidity实现需重点处理通道合约结构、ECDSA签名验证和状态序列化,结合EIP-1559和

weixin_34323858的博客 369

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

以太坊支付通道

以太坊及相关的区块链技术的长处在于可以通过去中心化和无需信任的方式进行转账,不过在实现高效益的小额支付上仍需努力。本文讨论了小额交易的问题,介绍了支付通道,并概述了支付通道的工作方式。 下图的交易流程可大致反映以太坊的简单支付流程: 先由发送方(sender)将钱包里的以太币发送给以太坊网络,再由后者将一定数量的以太币分配给接收方(recipient)。 还有额外一部分以太币——交易费——...

跨链技术践行者 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Raiden Network终极指南:如何实现以太坊链下快速支付通道

Raiden Network是基于以太坊的链下支付解决方案,旨在解决以太坊网络拥堵和交易费用高昂的问题。通过建立点对点的支付通道,Raiden Network能够实现即时、低成本的加密货币转账,为用户提供高效的区块链支付体验。 ## 一、Raiden Network核心功能解析 ### 1.1 链下支付通道工作原理 Raiden Network的核心创新在于采用了状态通道技术,允许用户在链下

gitblog_01057的博客 861

学习状态通道,Part-1:支付通道

在我的上一篇博文中,我简单地讨论了状态通道,以及为什么我认为它对于开启以太坊的大规模可用性来说,是至关重要的。在此,我打算通过几篇博文来推进一步,这些博文对 L4 团队用 Countfactual 做了什么,以及这个词到底是什么意思,提供了广泛的概述。在这第一篇博文中,我将要介绍状态通道的始祖O.G.——支付通道。 -我坚持要放这张图上来——不过没法让它看起来攻击性弱一些。你们就原谅我吧...

跨链技术践行者 8594

Solidity:编写一个简单的支付通道

根据例子学solidity

weixin_62775913的博客 949

支付通道网络:区块链二层扩容的核心原理与工程实践

区块链的可扩展性瓶颈,尤其是交易吞吐量低和手续费高昂的问题,长期制约着其在微支付等高频场景的应用。为解决这一难题,二层扩容技术应运而生,其核心思想是将大量交易转移到链下处理,仅将关键结算环节锚定到主链,从而在保持安全性的前提下大幅提升性能。支付通道网络作为最成熟的二层方案之一,通过建立点对点的链下通道,实现了近乎即时、低成本的价值转移。其技术基石包括多重签名、时间锁和哈希时间锁定合约,确保了链下交易的安全与原子性。然而,构建去中心化的支付网络面临路由寻径、流动性管理和经济激励等复杂挑战,需要结合网络科学与博

weixin_30755393的博客 822

TanStack Table v9 中 getFilteredRowModel() 的迁移指南:v8 兼容标记函数与 filteredRowModel 新特性槽位

本篇技术指南围绕 TanStack Table(当前仓库)中 React 适配层的 **`getFilteredRowModel()`** 函数展开:它是在 v9 中为兼容 v8 API 而保留的**标记式(marker)桩函数**,本身不做任何过滤计算,只负责告诉 `useLegacyTable` 钩子"启用客户端列过滤功能"。读完本文,你将掌握该函数的签名与类型语义、它在 `useLegacy

gitblog_00068的博客 725

50行代码写就以太坊支付

状态通道(State Channel)是非常流行的扩容方案。比特币线下支付通道有闪电(lightning),以太坊有雷电(Raiden) 本文演示如何立刻用合约写以太坊支付. 源代码在这里 假设在Alice和Bob之间发生的微支付场景: Bob雇佣Alice为他的推特的水军,定期在Bob的推特上发推,回帖。为此BOB答应Alice,每发一个推(twee...

weixin_34342207的博客 177

基于以太坊的快速数字资产交易

以太坊上网络支付通道  Raiden 利用链下网络状态技术给以太坊上的数字资产带来了许多nice的属性: 1.可扩展性: 它与参与者的数量呈线性关系(每秒可能有1,000,000+次转帐)。 2.快速: 转账在一秒钟的时间内被确认和确定。 3.匿名性:单次转帐不会显示在全局分布式帐本中。 4.互操作性: 以太坊上任何实现了标准代币的接口的代币都可以互相交易。 5.低额交易...

开发之路 718

Raiden Network智能合约详解:支付通道与代币交互机制

Raiden Network是基于以太坊的Layer 2扩展解决方案,通过链下支付通道技术实现快速、低成本的代币转账。本文将深入解析其智能合约架构、支付通道工作原理及代币交互机制,帮助开发者和用户理解这一革命性的区块链支付系统。 ## 一、Raiden Network架构概览 Raiden Network的核心设计是将大部分交易转移到链下处理,仅在必要时与以太坊主链交互。其架构主要包含以下组件

gitblog_00662的博客 414

以太坊虚拟机原理

**摘要:**以太坊虚拟机(EVM)是以太坊智能合约的运行环境,被称为“区块链世界的CPU”,负责执行智能合约代码并管理区块链状态。EVM支持多种账户类型(外部账户和合约账户)和存储结构(堆栈、内存和存储)。其交易机制基于Gas费用,确保网络安全和矿工激励。合约通过ABI与外部交互,定义函数调用规则。以太坊2.0升级后,EVM整合执行层与共识层,并通过Rollups、分片等技术提升扩容能力。学习EVM原理是区块链开发的核心,推荐结合Solidity和框架(如Hardhat)实践。

omonday1234的专栏 962

以太坊闪电网络实现原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34212189的博客 654
上一篇: 以太坊 p2p Server 原理及实现
下一篇: 什么是智能合约
落叶无声9
博客等级 码龄12年 443粉丝 343原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值