SmartWallet开发包适用于平台方高效完成对用户地址上的Ether/ERC20代币的归集工作,无需向用户地址注入Ether即可完成Ether/ERC20代币的归集。官方下载地址:以太坊智能钱包PHP开发包。
1、开发包概述
SmartWallet开发包的主要特点如下:
- 真正的平台型非托管钱包,平台无需管理大量用户地址的密钥并且没有安全性的损失
- 无需向用户地址注入Ether即可完成以太币/ERC20代币的归集,流程更简单,效率更高
- 支持在单一交易内完成多个用户地址的归集
SmartWallet运行于PHP 7.1+环境下,主要类以及其关系如下图所示:
SmartWallet的主要代码文件清单如下:
文件路径 | 说明 |
---|---|
ethtool/src/SmartWalletKit.php | SmartWallet开发包的入口类 |
ethtool/src/Credential.php | 以太坊身份账号类 |
ethtool/src/SmartWalletFactory.php | SmartWalletFactory合约的封装类 |
ethtool/src/ERC20Token.php | ERC20代币合约的封装类 |
ethtool/src/SmartContract.php | 以太坊智能合约基类 |
ethtool/src/Callback.php | 回调函数类 |
contract/ERC20.sol | ERC20标准接口 |
contract/HappyToken.sol | 用于演示的ERC20代币合约 |
contract/SmartWalletFactory.sol | 智能钱包工厂合约 |
demo/deploy-contracts.php | 演示如何部署SmartWalletFactory合约 |
demo/generate-user-wallet.php | 演示如何为用户生成平台智能钱包 |
demo/fund-user-wallet.php | 模拟用户的充值操作 |
demo/get-user-balance.php | 演示如何查询用户钱包的以太币/ERC20代币余额 |
demo/sweep-user-wallet.php | 演示如何归集用户钱包的以太币/ERC20代币余额 |
bin/solc | solidity编译器 |
build-contract.sh | 合约编译构建脚本 |
vendor/ | 第三方依赖包 |
composer.json | composer配置文件 |
2、使用示例代码
2.1 部署工厂合约
SmartWallet开发包利用工厂合约SmartWalletFacotry管理用户地址的生成与归集。因此首先需要部署工厂合约。
示例代码demo/deploy-contracts.php
展示了如何部署SmartWalletFactory合约以及一个用于演示的ERC20代币合约。
执行如下命令运行示例代码:
php deploy-contracts.php
运行结果如下:
2.2 生成用户地址
示例代码demo/generate-user-address.php
展示了如何利用SmartWallet开发包为用户生成平台地址。执行如下命令运行示例代码:
php generate-user-wallet.php
运行结果如下:
注:生成用户地址不需要任何手续费。
2.3 用户充值
示例代码demo/fund-user-address.php
模拟了用户向平台地址的充值行为。执行如下命令运行示例代码:
php fund-user-wallet.php
运行结果如下:
2.4 查看用户地址余额
示例代码demo/get-user-balance.php
展示了如何查询用户地址的Ether/ERC20代币余额。 执行如下命令运行示例代码:
php get-user-balance.php
运行结果如下:
2.5 归集用户地址余额
示例代码demo/sweep-user-address.php
展示了如何利用归集用户地址上的以太币和ERC20代币到指定的地址。 执行如下命令运行示例代码:
php sweep-user-wallet.php
运行结果如下:
3、Credential类的使用方法
SmartWallet开发包使用Credential
对象来表示一个特定的以太坊账号,该对象包含了账号的密钥和地址信息。
3.1 实例化Credential
使用静态方法new()
创建一个新的以太坊账户,例如:
//use ethtool\Credential;
$credential = Credential::new(); // 创建一个新的账号
也可以使用静态方法fromKey()
导入已有的私钥来实例化Credential对象,例如:
$credential = Credential::fromKey(
'0x4f3edf983ac6......b113bce9c46' // 要导入的私钥
);
3.2 查看账户的密钥和地址
Credential类提供了如下方法获取当前账户的私钥、公钥和地址:
- getPrivateKey():返回私钥16进制字符串
- getPublicKey():返回公钥16进制字符串
- getAddress():返回地址16进制字符串
例如,下面的代码创建一个新的以太坊账户并显示其地址:
$credential = Credential::new();
echo 'address => ' . $credential.getAddress() . PHP_EOL; // 显示账号地址
3、SmartWalletKit类的使用方法
3.1 实例化SmartWalletKit
SmartWalletKit是SmartWallet开发包的入口类,实例化时需要传入以太坊节点URL和一个Credential对象。例如:
//use ethtool\Credential;
//use ethtool\SmartWalletKit;
$kit = new SmartWalletKit(
'http://localhost:8545', // 以太坊节点URL
Credential::fromKey('0x......') // 以太坊账号对象
);
3.2 生成用户地址
使用SmartWalletKit的getUserWallet()
方法为指定的用户生成平台地址,例如:
$userId = 'u010203'; // 用户的平台ID
$userAddress = $kit->generateUserWallet($userId); // 返回用户地址
echo 'user address => ' . $userWallet . PHP_EOL; // 显示用户地址
3.3 归集单个用户地址余额
使用SmartWalletKit的sweepUserWallet()
方法归集指定用户地址的以太币/ERC20代币余额。例如:
$userId = 'u010203'; // 用户的平台ID
$txid = $kit->sweepUserWallet($userId); // 返回归集交易ID
echo 'sweep txid => ' . $txid . PHP_EOL; // 显示归集交易ID
3.4 批量归集用户地址余额
使用SmartWalletKit的sweepUserWallets()
方法归集一组用户地址的以太币/ERC20代币余额。例如:
$uids = ['u010203', 'u030405', 'u050607']; // 用户的平台ID
$txid = $kit->sweepUserWallets($uids); // 返回归集交易ID
echo 'sweep txid => ' . $txid . PHP_EOL; // 显示归集交易ID
3.5 操作ERC20代币
使用SmartWalletKit的erc20()
方法获取指定地址的ERC20代币实例,调用标准的ERC20接口即可操作代币。例如查询USDT余额并转账:
$somebody = '0xb8001c3e...e4a361ec1';
$token = $kit->erc20('0xdac17f958d2ee523a2206206994597c13d831ec7');
echo 'balance of somebody => ' . $token.balanceOf($somebody) . PHP_EOL; // 查询代币余额
$txid = $kit->transfer($somebody, '100000000'); // 代币转账
echo 'transfer token txid => ' . $txid . PHP_EOL;
SmartWallet开发包下载地址:http://sc.hubwiz.com/codebag/smartwallet-php/