以太坊之Ubuntu平台DApp私链环境的搭建

一、安装准备

① 查看当前 CPU 架构

  • 在终端中执行以下命令,确定是 32 位架构还是 64 位架构:
~$ uname –p
x86_64
  • 如果看到输出 x86_64,那么就是 64 位系统,否则是 32 位。

② 下载工具

  • 确保安装了下载工具 wget:
~$ wget –V
GNU Wget 1.17.1 built on linux-gnu
  • 如果还没有安装 wget,使用 apt-get 来安装:
~$ sudo apt-get install wget

二、安装 DApp 开发环境

① 安装 Node.js

  • 首先根据 ubuntu 是 32 位还是 64 位,分别下载不同的预编译版本,使用官方长期支持的 8.10.0LTS 版本:
    • 32 位:
~$ wget https://nodejs.org/dist/v8.10.0/node-v8.10.0-linux-x86.tar.gz
    • 64 位:
~$ wget https://nodejs.org/dist/v8.10.0/node-v8.10.0-linux-x64.tar.gz
  • 然后解压到当前目录,以 64 位为例:
~$ tar zxvf node-v8.10.0-linux-x64.tar.gz
  • 然后接下来修改 .bashrc 来设置相关的环境变量:
~$ echo "export NODE_HOME=$HOME/node-v8.10.0-linux-x64"
>> .bashrc
~$ echo "export NODE_PATH=$NODE_HOME/lib/node_modules"
>> .bashrc
~$ echo "export PATH=$NODE_HOME/bin:$PATH" >> .bashrc
  • 最后重新载入 .bashrc(或者重新登录)来使 node 生效:
~$ source .bashrc
  • 现在,可以使用 node:
~$ node –v
v8.10.0

② 安装 Geth

  • 在终端执行以下命令:
~$ wget
https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.8.3-329ac18e.tar.gz
~$ mv get-linux-amd64-1.8.3-329ac18e geth
~$ echo export PATH=$HOME/geth:$PATH >> .bashrc
~$ soure .bashrc
  • 安装完毕后,执行命令验证安装成功:
~$ geth version
Geth
Version: 1.8.3-stable

③ 安装 solidity 编译器

  • 安装编译器:
~$ npm install –g solc
  • 安装完毕后,执行命令验证安装成功:
~$ solcjs –version
0.40.2+commit.3155dd80.Emscripten.clang

④ 安装 web3

  • 安装:
~$ npm install –g web3@0.20.2
  • 安装验证:
~$ node –p 'require("web3")'
{[Function: Web3]
providers:{}}

⑤ 安装 truffle 框架

  • 执行以下命令安装 truffle 开发框架:
~$ npm install –g truffle
  • 验证安装:
~$ truffle version
Truffle v4.1.3 (core 4.1.3)

⑥ 安装 webpack

  • 执行以下命令安装 webpack:
~$ npm install –g webpack@3.11.0
  • 验证安装:
~$ webpack –v
3.11.0

三、运行私链节点

① 创世块配置

  • 创建一个节点目录 node1,并在其中创建私链的创世块配置文件:
~$ mkdir node1
~$ cd node1
~/node1$ touch private.json
  • 然后编辑内容如下:
{
	"config": {
		"chainId": 7878,
		"homesteadBlock": 0,
		"eip155Block": 0,
		"eip158Block": 0
	},
	"difficulty": "200",
	"gasLimit": "2100000",
	"alloc": {
		"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
		"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
	}
}
  • config.chainId 用来声明以太坊网络编号,选择一个大于 10 的数字即可。difficulty 用来声明挖矿难度,越小的值难度越低,也就能更快速地出块。

② 初始化私链节点

  • 执行 geth 的 init 命令初始化私链节点:
~/node1$ geth --datadir ./data init private.json
  • 这会在当前目录下创建 data 目录,用来保存区块数据及账户信息:
~/node1$ ls
data private.json
  • 可以上述命令写到一个脚本 init.sh 里,这样避免每次都输入那么多记不住的东西:
~/node1$ touch init.sh
~node1$ chmod +x init.sh
  • 编辑内容如下:
#!/bin/bash
geth --datadir ./data init private.json
  • 在部署下一个节点时,就可以直接执行这个脚本迚行初始化。例如,在另一台机器上:
~/node1$ ./init.sh

③ 启动私链节点

  • 从指定的私链数据目录启动并设定一个不同的网络编号来启动节点:
~/node1$ geth --rpc --datadir ./data --networkid 7878 console
  • 同样,可以用一个脚本 console.sh 来简化启动节点时的输入:
~/node1$ touch console.sh
~/node1$ chmod +x console.sh
  • 编辑内容如下:
#!/bin/bash
geth --rpc \
	--rpcaddr 0.0.0.0 \
	--rpccorsdomain "*" \
	--datadir ./data \
	--networkid 7878 \
	console
  • rpcaddr 参数用来声明节点 RPC API 的监听地址,设为 0.0.0.0 就可以从其他机器访问 API;rpccorsdomain 参数是为解决 web3 从浏览器中跨域调用的安全限制问题。
  • 以后启动节点,只要直接执行这个脚本即可:
~/node1$ ./console.sh

四、账户管理

① 查看账户列表

  • 在 geth 控制台,使用 eth 对象的 accounts 属性查看目前的账户列表:
> eth.accounts
[
]
  • 因为还没有创建账户,所以这个列表还是空的。

② 创建新账户

  • 在 geth 控制台,使用 personal 对象的 newAccount() 方法创建一个新账户,参数为自己选择的密码:
> personal.newAccount(
'
78787878')
0xd8bcf1324d566cbec5d3b67e6e14485b06a41d49
  • 输出就是新创建的账户地址(公钥),输出不会和上面的示例相同。geth 会保存到数据目录下的 keystore 文件中。密码要自己记住,以后还需要用到。

③ 查询账户余额

  • 在 geth 控制台,使用 personal 对象的 getBalance() 方法获取指定账户的余额,参数为账户地址:
> eth.getBalance(eth.accounts[0])
0
  • 或者直接输入账户地址:
> eth.getBalance('0xd8bcf1324d566cbec5d3b67e6e14485b06a41d49')
0
  • 新创建的账户,余额果然为 0。

④ 挖矿

  • 没钱的账户什么也干不了,需要挖矿来挣点钱。在 geth 控制台执行 miner 对象的 start() 方法来启动挖矿:
> miner.start(1)
  • 等几分钟以后,检查账户余额:
> eth.getBalance(eth.accounts[0])
2.695e+21
  • 钱不少了,2695ETH,目前市值将近 500 万人民币,执行 miner 对象的 stop() 方法停止挖矿:
> miner.stop()

⑤ 解锁账户

  • 在部署合约时需要一个解锁的账户,在 geth 控制台使用 personal 对象的 unlockAccount() 方法来解锁指定的账户,参数为账户地址和账户密码(在创建账户时指定的那个密码):
> eth.unlockAccount(eth.accounts[0],'78787878')
true

五、构建示例项目

① 新建 DApp 项目

  • 执行以下命令创建项目目录并迚入该目录:
~$ mkdir demo
~$ cd demo
  • 然后用 webpack 模版初始化项目骨架结构:
~/demo$ truffle unbox webpack
Downloading…
Unpacking…
Setting up…
Unbox successful. Sweet!

② 安装项目依赖的 NPM 包

  • 执行以下命令安装 nmp 包:
~/demo$ npm install

③ 修改 truffle 配置

  • truffle.js 中,修改 port 为 8545,因为 geth 默认在 8545 端口监听:
module.exports = {
	networks:{
		development: {
			…
			port: 8545}
	}
}

④ 启动节点

  • 在另一个终端,执行以下命令启动节点软件,以便部署合约并执行交易:
~$ cd node1
~/node1$ ./console.sh
>
  • 为了在节点上部署合约,别忘了启动 geth 后先解锁账户:
> personal.unlockAcount(eth.accounts[0],'78787878')
true

⑤ 编译合约

  • 执行以下命令编译项目合约:
~/demo$ truffle compile

⑥ 部署合约

  • 执行以下命令来部署合约:
~/demo$ truffle migrate
  • 如果之前忘了在 geth 控制台解锁账户,会看到如下错误,参考前面说明进行解锁即可:
…
Error: authentication needed: password or unlock
  • 如果已经正确地解锁了账户,会看到部署过程停止在如下状态:
Replacing Migrations…
… 0x3088762a5bc9
  • 这是因为 truffle 在等待部署交易提交,但是在私链中还没有启动挖矿。现在切换回 geth 终端窗口,查看交易池的状态:
> txpool.status
{
	pending:1,
	queued:0
}
  • 果然有一个挂起的交易,启动挖矿就是:
> miner.start(1)
  • 稍等小会儿,再查看交易池的状态:
> txpool.status
{
	pending:0,
	queued:0
}
  • 交易已经成功提交,可以停止挖矿,因为它太占 CPU:
> miner.stop()
  • 现在切换回 truffle 那个终端,部署过程也正确地执行完成。

⑦ 启动 DApp

  • 执行以下命令来启动 DApp:
 ~/demo$ npm run dev

在这里插入图片描述

  • 如果希望从别的机器也可以访问 DApp 应用,修改一下package.json:
{
	scripts:{
		"dev":"webpack-dev-server –-host 0.0.0.0"
	}
}
     区块起源于比特币,2008年11月1日,一位自称中本聪(Satoshi Nakamoto)的人发表了《比特币:一种点对点的电子现金系统》一文 [4]  ,阐述了基于P2P网络技术、加密技术、时间戳技术、区块技术等的电子现金系统的构架理念,这标志着比特币的诞生。两个月后理论步入实践,2009年1月3日第一个序号为0的创世区块诞生。几天后2009年1月9日出现序号为1的区块,并与序号为0的创世区块相连接形成了,标志着区块的诞生 [5]  。 近年来,世界对比特币的态度起起落落,但作为比特币底层技术之一的区块技术日益受到重视。在比特币形成过程中,区块是一个一个的存储单元,记录了一定时间内各个区块节点全部的交流信息。各个区块之间通过随机散列(也称哈希算法)实现接,后一个区块包含前一个区块的哈希值,随着信息交流的扩大,一个区块与一个区块相继接续,形成的结果就叫区块。 什么是区块?从科技层面来看,区块涉及数学、密码学、互联网和计算机编程等很多科学技术问题。从应用视角来看,简单来说,区块是一个分布式的共享账本和数据库,具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。这些特点保证了区块的“诚实”与“透明”,为区块创造信任奠定基础。而区块丰富的应用场景,基本上都基于区块能够解决信息不对称问题,实现多个主体之间的协作信任与一致行动 [7]  。 区块是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块(Blockchain),是比特币的一个重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块 [8]  。 比特币白皮书英文原版 [4]  其实并未出现 blockchain 一词,而是使用的 chain of blocks。most早的比特币白皮书中文翻译版 [9]  中,将 chain of blocks 翻译成了区块。这是“区块”这一中文词most早的出现时间。 国家互联网信息办公室2019年1月10日发布《区块信息服务管理规定》,自2019年2月15日起施行 [1]  。 作为核心技术自主创新的重要突破口,区块的安全风险问题被视为当前制约行业健康发展的一大短板,频频发生的安全事件为业界敲响警钟。拥抱区块,需要加快探索建立适应区块技术机制的安全保障体系。 2008年由中本聪第一次提出了区块的概念 [4]  ,在随后的几年中,区块成为了电子货币比特币的核心组成部分:作为所有交易的公共账簿。通过利用点对点网络和分布式时间戳服务器,区块数据库能够进行自主管理。为比特币而发明的区块使它成为第一个解决重复消费问题的数字货币。比特币的设计已经成为其他应用程序的灵感来源。 2014年,区块2.0”成为一个关于去中心化区块数据库的术语。对这个第二代可编程区块,经济学家们认为它是一种编程语言,可以允许用户写出更精密和智能的协议 [11]  。因此,当利润达到一定程度的时候,就能够从完成的货运订单或者共享证书的分红中获得收益。区块2.0技术跳过了交易和“价值交换中担任金钱和信息仲裁的中介机构”。它们被用来使人们远离全球化经济,使隐得到保护,使人们“将掌握的信息兑换成货币”,并且有能力保证知识产权的所有者得到收益。第二代区块技术使存储个人的“永久数字ID和形象”成为可能,并且对“潜在的社会财富分配”不平等提供解决方案 [12]  。 2016年1月20日,中国人民银行数字货币研讨会宣布对数字货币研究取得阶段性成果。会议肯定了数字货币在降低传统货币发行等方面的价值,并表示央行在探索发行数字货币。中国人民银行数字货币研讨会的表达大大增强了数字货币行业信心。这是继2013年12月5日央行五部委发布关于防范比特币风险的通知之后,第一次对数字货币表示明确的态度。 [13]  2016年12月20日,数字货币联盟——中国FinTech数字货币联盟及FinTech研究院正式筹建 [14]  。 如今,比特币仍是数字货币的绝对主流,数字货币呈现了百花齐放的状态,常见的有bitcoin、litecoin、dogecoin、dashcoin,除了货币的应用之外,还有各种衍生应用,如以太坊Ethereum、Asch等底层应用开发平台以及NXT,SIA,比特股,MaidSafe,Ripple等行业应用。 公有区块 公有区块(Public Block Chains)是指:世界上任何个体或者团体都可以发送交易,且交易能够获得该区块的有效确认,任何人都可以参与其共识过程。公有区块是most早的区块,也是应用most广泛的区块,各大bitcoins系列的虚拟数字货币均基于公有区块,世界上有且仅有一条该币种对应的区块 [16]  。 联合(行业)区块 行业区块(Consortium Block Chains):由某个群体内部指定多个预选的节点为记账人,每个块的生成由所有的预选节点共同决定(预选节点参与共识过程),其他接入节点可以参与交易,但不过问记账过程(本质上还是托管记账,只是变成分布式记账,预选节点的多少,如何决定每个块的记账者成为该区块的主要风险点),其他任何人可以通过该区块开放的API进行限定查询 [16]  。 有区块 有区块(Private Block Chains):仅仅使用区块的总账技术进行记账,可以是一个公司,也可以是个人,独享该区块的写入权限,本与其他的分布式存储方案没有太大区别。传统金融都是想实验尝试有区块,而公的应用例如bitcoin已经工业化,的应用产品还在摸索当中 [16]  。 去中心化。区块技术不依赖额外的第三方管理机构或硬件设施,没有中心管制,除了自成一体的区块本身,通过分布式核算和存储,各个节点实现了信息自我验证、传递和管理。去中心化是区块most突出most本质的特征 [17]  。 开放性。区块技术基础是开源的,除了交易各方的有信息被加密外,区块的数据对所有人开放,任何人都可以通过公开的接口查询区块数据和开发相关应用,因此整个系统信息高度透明 [17]  。 独立性。基于协商一致的规范和协议(类似比特币采用的哈希算法等各种数学算法),整个区块系统不依赖其他第三方,所有节点能够在系统内自动安全地验证、交换数据,不需要任何人为的干预 [17]  。 安全性。只要不能掌控全部数据节点的51%,就无法肆意操控修改网络数据,这使区块本身变得相对安全,避免了主观人为的数据变更 [17]  。 匿名性。除非有法律规范要求,单从技术上来讲,各区块节点的身份信息不需要公开或验证,信息传递可以匿名进行 架构模型 区块基础架构模型 一般说来,区块系统由数据层、网络层、共识层、激励层、合约层和应用层组成 [15]  。 其中,数据层封装了底层数据区块以及相关的数据加密和时间戳等基础数据和基本算法;网络层则包括分布式组网机制、数据传播机制和数据验证机制等;共识层主要封装网络节点的各类共识算法;激励层将经济因素集成到区块技术体系中来,主要包括经济激励的发行机制和分配机制等;合约层主要封装各类脚本、算法和智能合约,是区块可编程特性的基础;应用层则封装了区块的各种应用场景和案例。该模型中,基于时间戳的式区块结构、分布式节点的共识机制、基于共识算力的经济激励和灵活可编程的智能合约是区块技术most具代表性的创新点 [18]  。 核心技术 分布式账本 分布式账本指的是交易记账由分布在不同地方的多个节点共同完成,而且每一个节点记录的是完整的账目,因此它们都可以参与监督交易合法性,同时也可以共同为其作证 [19]  。 跟传统的分布式存储有所不同,区块的分布式存储的独特性主要体现在两个方面:一是区块每个节点都按照块式结构存储完整的数据,传统分布式存储一般是将数据按照一定的规则分成多份进行存储。二是区块每个节点存储都是独立的、地位等同的,依靠共识机制保证存储的一致性,而传统分布式存储一般是通过中心节点往其他备份节点同步数据。没有任何一个节点可以单独记录账本数据,从而避免了单一记账人被控制或者被贿赂而记假账的可能性。也由记账节点足够多,理论上讲除非所有的节点被破坏,否则账目就不会丢失,从而保证了账目数据的安全性 [19]  。 非对称加密 存储在区块上的交易信息是公开的,但是账户身份信息是高度加密的,只有在数据拥有者授权的情况下才能访问到,从而保证了数据的安全和个人的隐 [20]  。 共识机制 共识机制就是所有记账节点之间怎么达成共识,去认定一个记录的有效性,这既是认定的手段,也是防止篡改的手段。区块提出了四种不同的共识机制,适用于不同的应用场景,在效率和安全性之间取得平衡 [20]  。 区块的共识机制具备“少数服从多数”以及“人人平等”的特点,其中“少数服从多数”并不完全指节点个数,也可以是计算能力、股权数或者其他的计算机可以比较的特征量。“人人平等”是当节点满足条件时,所有节点都有权优先提出共识结果、直接被其他节点认同后并most后有可能成为most终共识结果。以比特币为例,采用的是工作量证明,只有在控制了全网超过51%的记账节点的情况下,才有可能伪造出一条不存在的记录。当加入区块的节点足够多的时候,这基本上不可能,从而杜绝了造假的可能 [20]  。 智能合约 智能合约是基于这些可信的不可篡改的数据,可以自动化的执行一些预先定义好的规则和条款。以保险为例,如果说每个人的信息(包括医疗信息和风险发生的信息)都是真实可信的,那就很容易的在一些标准化的保险产品中,去进行自动化的理赔。在保险公司的日常业务中,虽然交易不像银行和证券行业那样频繁,但是对可信数据的依赖是有增无减。因此,笔者认为利用区块技术,从数据管理的角度切入,能够有效地帮助保险公司提高风险管理能力。具体来讲主要分投保人风险管理和保险公司的风险监督 [20]  。 应用 金融领域 区块在国际汇兑、信用证、股权登记和证券交易所等金融领域有着潜在的巨大应用价值。将区块技术应用在金融行业中,能够省去第三方中介环节,实现点对点的直接对接,从而在大大降低成本的同时,快速完成交易支付 [21]  。 比如Visa推出基于区块技术的 Visa B2B Connect,它能为机构提供一种费用更低、更快速和安全的跨境支付方式来处理全球范围的企业对企业的交易。要知道传统的跨境支付需要等3-5天,并为此支付1-3%的交易费用。Visa 还联合 Coinbase 推出了首张比特币借记卡,花旗银行则在区块上测试运行加密货币“花旗币” [21]  。 物联网和物流领域 区块在物联网和物流领域也可以天然结合。通过区块可以降低物流成本,追溯物品的生产和运送过程,并且提高供应管理的效率。该领域被认为是区块一个很有前景的应用方向 [22]  。 区块通过结点连接的散状网络分层结构,能够在整个网络中实现信息的全面传递,并能够检验信息的准确程度。这种特性一 定程度上提高了物联网交易的便利性和智能化。区块+大数据的解决方案就利用了大数据的自动筛选过滤模式,在区块中建立信用资源,可双重提高交易的安全性,并提高物联网交易便利程度。为智能物流模式应用节约时间成本。区块结点具有十分自由的进出能力,可独立的参与或离开区块体系,不对整个区块体系有任何干扰。区块 +大数据解决方案就利用了大数据的整合能力,促使物联网基础用户拓展更具有方向性,便于在智能物流的分散用户之间实现用户拓展 [22]  。 公共服务领域 区块在公共管理、能源、交通等领域都与民众的生产生活息息相关,但是这些领域的中心化特质也带来了一些问题,可以用区块来改造。区块提供的去中心化的完全分布式DNS服务通过网络中各个节点之间的点对点数据传输服务就能实现域名的查询和解析,可用于确保某个重要的基础设施的操作系统和固件没有被篡改,可以监控软件的状态和完整性,发现不良的篡改,并确保使用了物联网技术的系统所传输的数据没用经过篡改 [23]  。 数字版权领域 通过区块技术,可以对作品进行鉴权,证明文字、视频、音频等作品的存在,保证权属的真实、唯一性。作品在区块上被确权后,后续交易都会进行实时记录,实现数字版权全生命周期管理,也可作为司法取证中的技术性保障。例如,美国纽约一家创业公司Mine Labs开发了一个基于区块的元数据协议,这个名为Mediachain的系统利用IPFS文件系统,实现数字作品版权保护,主要是面向数字图片的版权保护应用 [24]  。 保险领域 在保险理赔方面,保险机构负责资金归集、投资、理赔,往往管理和运营成本较高。通过智能合约的应用,既无需投保人申请,也无需保险公司批准,只要触发理赔条件,实现保单自动理赔。一个典型的应用案例就是LenderBot, 是 2016 年由区块企业 Stratumn、德勤与支付服务商 Lemonway 合作推出,它允许人们通过 Facebook Messenger 的聊天功能,注册定制化的微保险产品, 为个人之间交换的高价值物品进行投保,而区块在贷款合同中代替了第三方角色 [25]  。 公益领域 区块上存储的数据,高可靠且不可篡改,天然适合用在社会公益场景。公益流程中的相关信息,如捐赠项目、募集明细、资金流向、受助人反馈等,均可以存放于区块上,并且有条件地进行透明公开公示,方便社会监督 [26]  。 面临的挑战 从实践进展来看,区块技术在商业银行的应用大部分仍在构想和测试之中,距离在生活、生产中的运用还有很长的路,而要获得监管部门和市场的认可也面临不少困难,主要有: (一)受到现行观念、制度、法律制约。区块去中心化、自我管理、集体维护的特性颠覆了人们生产生活方式,淡化了国家、监管概念,冲击了现行法律安排。对于这些,整个世界完全缺少理论准备和制度探讨。即使是区块应用most成熟的比特币,不同国家持有态度也不相同,不可避免阻碍了区块技术的应用与发展。解决这类问题,显然还有很长的路要走 [27]  。 (二)在技术层面,区块尚需突破性进展。区块应用尚在实验室初创开发阶段,没有直观可用的成熟产品。比之于互联网技术,人们可以用浏览器、APP等具体应用程序,实现信息的浏览、传递、交换和应用,但区块明显缺乏这类突破性的应用程序,面临高技术门槛障碍。再比如,区块容量问题,由于区块需要承载复制之前产生的全部信息,下一个区块信息量要大于之前区块信息量,这样传递下去,区块写入信息会无线增大,带来的信息存储、验证、容量问题有待解决 [27]  。 (三)竞争性技术挑战。虽然有很多人看好区块技术,但也要看到推动人类发展的技术有很多种,哪种技术更方便更高效,人们就会应用该技术。比如,如果在通信领域应用区块技术,通过发信息的方式是每次发给全网的所有人,但是只有那个有钥的人才能解密打开信件,这样信息传递的安全性会大大增加。同样,量子技术也可以做到,量子通信——利用量子纠缠效应进行信息传递——同样具有高效安全的特点,近年来更是取得了不小的进展,这对于区块技术来说,就具有很强的竞争优势。 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╰つ栺尖篴夢ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值