标签 ERC20 下的文章

这篇文章将会教你如何在 10 分钟中内借助 WordPress 搭建一个支持 ERC20 通证的在线 B2C 商城。

在区块链及通证经济备受瞩目的今天,很多开源社区纷纷在探讨如何将开源社区与区块链技术和通证经济相结合,从而为开源社区和开源生态提供自主、自洽、发展的动力和支持。我们 “Linux 中国”就是这诸多探索的开源社区之一。可喜的是,我们已经迈出了第一步:发布社区通证,也迈出了第二步,使通证流通起来。这里,我们愿意分享我们的经验给各个社区伙伴,使更多的开源社区也可以投身于新的生态探索,避开一些我们遇到的陷阱,从而共同营造一个更繁荣的开源世界。

我们的通证商城是基于 WordPress 的 WooCommerce 商城构建的。

安装 WordPress

在开始配置商城前,你需要先安装 WordPress 。你需要购买一个支持 PHP + MySQL 的虚拟主机,或自行配置 VPS、云服务器的环境,以支持 WordPress 的运行。

当你安装好 WordPress 后,你可以看到一个这样的后台。

安装 WooCommerce

安装完 WordPress 后,接下来安装 WordPress 的商城插件 WooCommerce ,点击菜单栏中的“插件”-“安装插件”,访问到安装插件的界面,在界面右上角的搜索框内容输入“WooCommerce”,并按下回车,可以搜索到 WooCommerce 。

点击现在安装,来安装 WooCommerce。安装完成后,点击“启用”,启用插件。

启用插件后, WooCommerce 会引导你进行初始化配置,根据提示对插件进行配置。

必要时,可以允许线下支付,但是针对加密货币而言,目前看起来不需要线下支付场景:

并设置邮费:

插件安装时,取消 MailChimp 的安装,仅启用 StoreFront:

并视需要觉得是否安装还是跳过 JetPack :

当你看到如图所示的界面时,就说明完成了初始化的配置了。

点击访问控制面板,回到 WordPress 界面。

添加 ERC20 通证作为支付货币

为了原生支持 ERC20 通证来实现支付,从而免去汇率换算,我们需要添加一款自定义的货币。

打开“插件”-“安装插件”,在关键词中输入 “Woocommerce Customize ERC20 Currency”并回车。这是我们联合硬核区块链公司开发的一款用于给 WooCommerce 增加 ERC20 货币的插件,该插件已经开源于 GitHub

找到 “Woocommerce Customize ERC20 Currency” 插件,并安装。

安装,并启用 “Woocommerce Customize ERC20 Currency”。

启用插件后,点击左侧菜单中的“设置”-“WooCommerce ERC20 货币自定义”,进入到插件的设置界面。

在插件的设置界面,你可以设置需要添加的货币的名称和对应的符号。比如这里我设置为 “LCCN” 和 “Ⓛ”,并点击“保存”。

保存后,点击左侧菜单栏中的“WooCommerce”-“设置”,进入到 WooCommerce 设置界面,在常规选项中,拖动到最底部,可以看到币种选项。点击货币,找到你自己设置的货币后,点击“设置”,并“保存”设置。

此时,站点的商品便以你自己设定的 ERC20 通证作为支付货币进行交易了。

安装 ERC20 通证支付网关

接下来,我们来安装“Woocommerce ERC20 Payment Gateway” 来开启站点的 ERC20 Token 的支付支持。这也是我们联合硬核区块链公司开发的一款用于给 WooCommerce 提供 ERC20 货币支付支持的插件,该插件已经开源于 GitHub

点击左侧菜单栏中的“插件”-“安装插件”,在关键词中输入 “Woocommerce ERC20 Payment Gateway”,并回车,找到 “Woocommerce ERC20 Payment Gateway”并安装、启用。

安装,并启用完成后,点击插件后的“设置”,进入到设置页面。

在设置页面,启用 “使用 ERC 20 Token 支付”这一支付方式,并保存。

然后点击支付方式后面的“设置”,进入到插件的设置界面。

首先,设置一些支付方式的基础信息。

标题是支付方式的标题,将会展示在结账的页面,因此,你可以将其设置为诸如“使用 LCCN 支付费用”或其他内容,让顾客明白此支付方式为使用通证支付。

描述会展示在支付方式的下方,同样的,你可以设置为 “使用 LCCN 支付费用”,此外,还建议你在此引导顾客安装、并打开 Metask 插件,切换到主网络,确保后续支付。

支付方式图标则会展示在支付方式标题后,将其设置为你的通证的图标,以获得更明显的提醒效果。

三者具体的示意图如下

支付方式设置完成后,接下来设置与 ERC20 通证有关的内容。

钱包地址为顾客支付时转账的对象,将其设置为你自己的钱包地址即可。

合约 ABI 则可以在 etherscan 中找到,比如,LCCN 的合约地址为:https://etherscan.io/address/0x8f4f3b3c3a900d10e9cf74c30e16f5958d8fd339#code,由于 LCCN 公开了其合约源代码,其 ABI 可以在合约的界面找到(如未公开,请向你的 ERC20 合约开发人员索要 ABI),点击右侧 “Copy”,复制 ABI,并将其填入设置项目中去。

合约地址为你的合约在对应网络中的地址。切记,如果你是测试环境,就需要将其设置为对应测试网络下的合约地址,如果是生产环境,就设置为主网的合约地址。

Gas 提醒这里是用来提醒用户支付时选择较高的 Gas ,从而加快确认的速度。你可以根据自己的需要设置具体的内容,也可以使用默认的语句。

至此,插件就已经设置完成了。

测试支付

插件设置完成后,我们来新建一个产品,用于测试。点击顶栏中的“新建”-“产品”,进入到创建产品的界面。

在产品界面输入产品名称、描述、售价等信息:

然后点击发布,创建新的产品。并点击“查看产品”,进入到产品的主页。

将其加入购物车:

在购物车界面点击“结算”,进行结算。

输入账单地址(账单地址将作为收货地址显示在界面中),点击“使用 Token 完成支付”。

在结算页面,拖动到底部,可以看到支付按钮,点击支付按钮,会自动唤起浏览器的 Metamask 插件。

在弹出的窗口中确认支付:

支付完成后,页面会自动刷新,并看到支付完成的字样。

处理订单

用户支付完成后,如何确定订单已经支付完成了呢?进入后台“仪表盘”-“WooCommerce”-“订单”,可以看到用户所有的订单。

正在处理状态的订单为用户已经支付完成,还没有处理的订单。点击该订单,进入到订单详情,在右侧的“订单备注”中可以看到交易的 Tx 值 。你可以点击对应链接,查看交易是否完成。

至此,整个使用 ERC20 通证的交易流程就走通了,接下来你就可以创建商品,使用 ERC20 通证 来完成你的 ERC20 在线交易流程啦!

关于硬核区块链

硬核区块链是一个区块链技术服务提供商,我们为顾客提供全面的 ERC20 通证发行、安全审计、解决方案构建、流通流程设计、 空投解决方案等服务,为顾客提供咨询与支付服务。

相关链接

这段时间以来,以太坊通证很流行。这些通证可以用来代表现实世界的各种价值单位:黄金谎言猫咪 甚至是类似 公司股票 一样的东西。迄今为止,人们已经募集了 20 亿美元的通证。那些通证是以 ERC20 为标准的,人们可以轻松地在钱包之间进行交易。在这篇教程中,我准备指导你部署你自己的 ERC20 通证到真实的以太坊网络上去。

事先准备:

  • 一个文本编辑器(Atom 不错,不过我喜欢 Vim
  • 对命令行和终端(模拟器)有起码的了解。Mac 内置的应用“终端”就很好,不过我喜欢 iTerm2
  • Chrome 浏览器
  • Node.js 8(或更高版本)
  • 你的通证的名字。我的准备叫做 HamburgerCoin(汉堡币)

你需要做的第一件事是安装 MetaMask。访问 Metamask 网站 并点击“Get Chrome Extention”。

Metamask 可以让你通过 Chrome 在以太坊上进行交易。它依靠运行着公开以太坊节点的 Infura ,所以你不用自己运行以太坊全节点。如果你颇具探索精神,你也可以下载和安装 Mist 以替代它。运行 Mist 就可以让你运行你自己的以太坊节点。运行自己的节点你就需要将你的计算机与该网络进行同步,这需要不短的时间。从技术上讲这更安全,因为这样你不必信任 Infura 来处理你的交易。Infura 可以忽略你的交易而干预你,但是它并不能偷走你的钱。因为安装 Metamask 比 Mist 更快也更简单,所以我假设你在下面的教程中使用 Metamask。

接着你需要安装 truffle

 $ npm install -g truffle

现在为你自己的新通证创建一个新目录,cd 到其中并初始化你的 truffle 项目。

$ mkdir hamburger-coin
$ cd hamburger-coin
$ truffle init

很好,你的 truffle 项目已经设置好了!

现在来创建我们的通证。首先我们需要安装 OpenZepplin 框架。OpenZepplin 框架包括了大量预先构建好的合约,包括我们要部署的 ERC20 通证合约。

(只需要按下回车接受默认值即可)

$ npm init
package name: (hamburger-coin)
version: (1.0.0)
description:
entry point: (truffle.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/masonf/src/hamburger-coin/package.json:

{
  "name": "hamburger-coin",
  "version": "1.0.0",
  "description": "",
  "main": "truffle.js",
  "directories": {
    "test": "test"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes) yes
$ npm install zeppelin-solidity

现在我们可以创建我们的通证合约了。创建一个 contracts/HamburgerCoin.sol 文件并加入如下内容:

pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/StandardToken.sol";

contract HamburgerCoin is StandardToken {
  string public name = "HamburgerCoin"; 
  string public symbol = "HBC";
  uint public decimals = 2;
  uint public INITIAL_SUPPLY = 10000 * (10 ** decimals);

  function HamburgerCoin() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
  }
}

(LCTT 译注:上述合约内容中指定了合约的名称、符号和供应量。在 ERC20 当中,通证的供应量其实是整数,上述合约中通证的实际供应量是 10000 * 100 个,出于显示 2 位小数的需求,你在合约浏览器、钱包软件中看到和操作的 1 个通证,实际上在交易中是以 100 个进行的。)

OpenZepplin 的 StandardToken 是一个标准的 ERC20 通证。如果你感兴趣,你可以看看它的 源代码 以了解是如何工作的。

实际上并不太复杂。该合约有一个 地址到余额 的映射(LCTT 译注:你可以理解为哈希、关联数组),它也有一个 允许转账 的列表。你可以看做是支票。你可以写张支票,但是直到它被兑付前,钱并不会被转账。

如果有人要转走一些资金,你可以在合约上调用 approve 方法,设置你要发送的通证数量。这就像是写支票一样。

然后调用 transferFrom 会实际进行转账。

我们可以从头写这些合约,但是最好采用经过完备的社区测试的合约。从头写一个 ERC20 通证那就是另外一篇文章了。

试着运行 compile 来编译我们的合约:

$ truffle compile
Compiling ./contracts/HamburgerCoin.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/ownership/Ownable.sol...
Compiling zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/MintableToken.sol...
Compiling zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts Next you'll need to add a migration file which will tell truffle how to deploy your contract.

接下来我们需要增加一个 truffle 迁移

创建 migrations/2_deploy_hamburgercoin.js 文件并添加如下内容:

var HamburgerCoin = artifacts.require("./HamburgerCoin.sol");

module.exports = function(deployer) {
  deployer.deploy(HamburgerCoin);
};

现在让我们配置 truffle 以能够使用 Infura 公共节点。如果我们要部署到公共节点,那就需要钱包的私钥。我们可以将该私钥包含在我们的源代码当中,但是如果任何人可以访问你的源代码(和版本库),他就能够偷走我们所有的汉堡币!要避免这种情况,我们会使用 dotenv node.js 模块。(LCTT 译注:dotenv 用于存储机密信息的文件 .env 是以 “.” 开头的,默认不会进入版本库,当然,如果有人能查看你全部的项目文件,你的私钥还是会被泄露。)

让我们安装部署到 Infura 所需的所有模块。

npm install --save-dev dotenv truffle-wallet-provider ethereumjs-wallet

(LCTT 译注:可能安装过程中会有很多警告,大多应该是属于定义了未使用的变量和方法的编译警告,可以忽略。)

现在编辑 truffle.js 并(原样)加入如下内容:

require('dotenv').config();
const Web3 = require("web3");
const web3 = new Web3();
const WalletProvider = require("truffle-wallet-provider");
const Wallet = require('ethereumjs-wallet');

var mainNetPrivateKey = Buffer.from(process.env["MAINNET_PRIVATE_KEY"], "hex")
var mainNetWallet = Wallet.fromPrivateKey(mainNetPrivateKey);
var mainNetProvider = new WalletProvider(mainNetWallet, "https://mainnet.infura.io/");

var ropstenPrivateKey = Buffer.from(process.env["ROPSTEN_PRIVATE_KEY"], "hex")
var ropstenWallet = Wallet.fromPrivateKey(ropstenPrivateKey);
var ropstenProvider = new WalletProvider(ropstenWallet, "https://ropsten.infura.io/");


module.exports = {
  networks: {
    development: {
      host: "localhost",
      port: 8545,
      network_id: "*" // Match any network id
    },
    ropsten: {
      provider: ropstenProvider,
      // You can get the current gasLimit by running
      // truffle deploy --network rinkeby
      // truffle(rinkeby)> web3.eth.getBlock("pending", (error, result) =>
      //   console.log(result.gasLimit))
      gas: 4600000,
      gasPrice: web3.toWei("20", "gwei"),
      network_id: "3",
    },
    mainnet: {
      provider: mainNetProvider,
      gas: 4600000,
      gasPrice: web3.toWei("20", "gwei"),
      network_id: "1",
    }
  }
};

(LCTT 译注:原文采用 new Buffer 来获取私钥设置,但 node.js 升级后,废弃了 new Buffer 这种用法,运行时会发出警告,所以上面我修改为使用 Buffer.from 。)

接下来我们从 Metamask 中得到我们的私钥:

  1. 点击你的 Chrome 窗口右上角的狐狸图标。
  2. 点击 “Account 1” 右侧的省略号。
  3. 点击 “Export Private Key”。
  4. 输入你的密码。
  5. 点击该文字以复制私钥到剪贴板。

然后打开 .env文件,并像下面这样贴入你的私钥(对于 Ropsten 测试网和 Mainnet 主网,你的私钥是一样的):

ROPSTEN_PRIVATE_KEY="123YourPrivateKeyHere"
MAINNET_PRIVATE_KEY="123YourPrivateKeyHere"

接下来,让我们部署到 Ropsten 以太坊测试网。

以太坊测试网是一个你可以测试合约的地方。此外还有 KovanRinkeby 测试网。我在这个教程中选择 Ropsten 是因为现在很容易得到 Ropsten 的测试 ETH。这些测试网都类似,你可以使用任何一个你喜欢的,但是在此教程当中我假设你在使用 Ropsten。访问 https://faucet.metamask.io/ 以得到一些测试 ETH。从 faucet 得到一些 ETH 后,你就可以部署了。

$ truffle deploy --network ropsten
Compiling ./contracts/HamburgerCoin.sol...
Compiling ./contracts/Migrations.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts

Using network 'ropsten'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xc2bbe6bf5a7c7c7312c43d65de4c18c51c4d620d5bf51481ea530411dcebc499
  Migrations: 0xd827b6f93fcb50631edc4cf8e293159f0c056538
Saving successful migration to network...
  ... 0xe6f92402e6ca0b1d615a310751568219f66b9d78b80a37c6d92ca59af26cf475
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying HamburgerCoin...
  ... 0x02c4d47526772dc524851fc2180b338a6b037500ab298fa2f405f01abdee21c4
  HamburgerCoin: 0x973b1a5c753a2d5d3924dfb66028b975e7ccca51
Saving artifacts...

在 “Saving aritfacts” 上面的这行即是你的合约的新地址。

复制并黏贴该地址到 Ropsten Etherscan 搜索框,你就能看到你新部署的合约。

现在你可以在任何 ERC20 兼容的钱包,如 MistMyEtherWallet(LCTT 译注:或 ImToken 这样的手机应用)里面使用你的通证了。

为了这篇教程,我构建了一个名为 Etherface 的钱包来做演示。

首先你需要添加你的通证到 Etherface:

  1. 访问 http://etherface.io/
  2. 确认你在 Metamask 中选择了 “Ropsten” 网络。
  3. 点击 “Tokens”。
  4. 点击右上角的加号按钮。
  5. 输入上面的合约地址。

如果你有朋友想要一些汉堡币,你现在就可以发送给他们了。如果没有,你也可以在你的两个账号间测试转账:

  1. 在 Metamask 中点击 “切换账号”按钮(在右上角),并改变你的账号为 “Account 2”。
  2. 点击 “Account 2” 右边的省略号,然后选择 “Copy Address to clipboard”。
  3. 切换回 “Account 1”,这很重要!否则交易会失败。
  4. 在 Etherface 中你的余额下点击 “Send”。
  5. 黏贴 “Account 2” 的地址。
  6. 输入你要发送的数量。
  7. Metamask 会弹出确认窗口,点击 “Submit”。
  8. 等大约 15-30 秒。
  9. 你的 “Account 1” 的余额应该会减少,“Account 2” 现在会有了一些汉堡币!

最后,让我们来部署到主网(LCTT 译注:这会花费你真实的 ETH,你可以通过查看前面部署到 Ropsten 的合约信息中了解花费了多少 gas,以相应估计实际要花费多少 ETH):

$ truffle deploy --network mainnet

你可以如前面一样加你的通证到 Etherface ,并发送你新打造的通证给你的朋友们了!