skopa / ethereum-rpc-wallet
以太坊网络JSONRPC钱包包装器
Requires
- php: >7.1.0
- ext-json: *
- ext-mbstring: *
- brick/math: ^0.8.8
- guzzlehttp/guzzle: ^6.4
- web3p/ethereum-tx: ^0.3.4
- web3p/ethereum-util: ^0.1.1
This package is auto-updated.
Last update: 2024-09-25 21:45:11 UTC
README
本包提供快速简单的接口与您部署的合约进行交互。目前实现了对ERC20代币的完全兼容。您还可以通过使用ABI代码与任何其他合约进行交互。
目前不是所有响应都已实现!只有静态类型:string, address, uint
本包提供“原样”
请注意,您的使用场景已完全测试!
示例
只需几个步骤即可开始与您的合约交互。在此之前,您的合约必须在区块链网络上成功部署。
1. 创建您的合约类
要创建和与合约交互,您需要扩展基本类:\Skopa\EthereumWallet\Contracts\ERC20TokenContract
并定义以下方法
- getAddress() - 必须返回合约的地址
- getABIJson() - 必须返回ABI代码的json字符串。对于ERC20合约可以忽略。
- getDecimals() - 必须返回小数位数
use \Skopa\EthereumWallet\Contracts\ERC20TokenContract; class ExampleContract extends ERC20TokenContract { public function getAddress(): string { return 'Contract address here'; } public function getABIJson(): ?string { return file_get_contents('ABI.json'); } public function getDecimals(): int { return 18; } } $exampleContract = new ExampleToken();
2. 连接到JSON RPC Geth服务器
设置与您的Geth服务器的连接。如何操作,您可以在https://github.com/ethereum/go-ethereum/wiki找到。
$networkClient = new JsonRpcNetworkClient( 'https://:8545', '90' );
第一个参数是服务器地址和端口。第二个是链ID。
3. 创建钱包实例
使用公共地址
$wallet = \Skopa\EthereumWallet\Wallet::fromPublicAddress( $network, 'Address in format: 0x...' );
如果您将来需要执行签名操作,您可以“解锁”您的钱包。如果私钥来自其他钱包,您将收到异常。
$wallet->unlock('private key');
使用私钥
$wallet = \Skopa\EthereumWallet\Wallet::fromPrivateKey( $network, 'private key' );
在这种情况下,钱包将从一开始就解锁。
4. 与合约交互
要与您的ERC20合约交互,只需将之前创建的ExampleContract实例传递给钱包方法,如示例所示
$contractManager = $wallet->contract($exampleContract);
$contractManager 是提供交互方法的 \Skopa\EthereumWallet\ERC20ContractManager 的实例
- requestContractTokenData()
- balance()
- balanceOf(string $address)
- transfer(Transaction $transaction)
- approve(Transaction $transaction)
- allowance(string $spender)
- allowanceBy(string $owner, string $spender)
- transferFrom(Transaction $transaction)
每个方法都有文档,您可以自行调查。
4.1 与自定义合约交互
您也可以使用此库与您的自定义合约交互。您可以通过扩展类 Skopa\EthereumWallet\Contracts\Contract 来创建您的合约实例。在这种情况下,您可以创建不兼容ERC20的自定义合约,与它交互或甚至扩展ERC20合约以使用自定义代币。但您必须提供ABI代码。
class ExampleContract extends Contract { public function myMethod(string $uint) { return '0x' . $this->functionSha('myMethod') . $this->formattedArg($amount); } }
获取合约管理器并与它交互
$contract = new ExampleContract; $contractManager = $wallet->customContract($contract);
由 customContract 方法返回的 Skopa\EthereumWallet\ContractManager 提供两种与合约交互的方法
- callDirectly(\Closure $closure) - 无签名的调用合约方法
- callDirectlySigned(\Closure $closure) - 通过事务调用合约方法
$custom = $contractManager->callDirectly(function (ExampleContract $token) { return $token->mint(\Skopa\EthereumWallet\Utils::amountToDecimalHex( \Brick\Math\BigDecimal::of('10') )); });
当然,您也可以扩展ERC20合约
class ExampleContract extends ERC20TokenContract { public function getAddress(): string { // ... } public function getABIJson(): ?string { // ... } public function getDecimals(): int { // ... } public function mint(string $amount) { return '0x' . $this->functionSha('mint') . $this->formattedArg($amount); } }
并以相同的方式与它交互
$custom = $contractManager->callDirectlySigned(function (ExampleContract $token) { return $token->mint(\Skopa\EthereumWallet\Utils::amountToDecimalHex( \Brick\Math\BigDecimal::of('10'), $token->getDecimals() )); });
5. 交易
要执行某些交易,您只需创建带有接收者和金额的交易实例,并通过 $contractManager 的 transfer 方法发送它。此方法将返回交易哈希。
$transaction = new \Skopa\EthereumWallet\Transaction('recipient address', '2.4') $res = $contractManager->transfer($transaction);
提醒:交易不是即时操作(根据区块链规范)。
6. 获取交易数据
您可以获取以下ERC20合约交易的数据
- 发送者地址
- 接收者地址
- 合约地址
- 区块时间戳
- 代币数量
- 成功 - 表示交易是否成功(布尔值)
要获取这些数据,您需要在钱包实例上调用 receipt 方法
$receipt = $wallet->receipt('transaction hash');
7. 此外
此外,库中包含一些辅助函数,例如从十进制到十六进制的转换等。您可以在源代码中了解这些。
总结
此库尚未完成,可能包含一些错误和异常。因此,它按“原样”分发。
想要表示感谢,请发送一些代币到以下地址:0xfd9c54573dd27f23d3c8df154bd550df4c44bd8a