skopa/ethereum-rpc-wallet

以太坊网络JSONRPC钱包包装器

v0.1.1 2019-12-25 11:26 UTC

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. 交易

要执行某些交易,您只需创建带有接收者和金额的交易实例,并通过 $contractManagertransfer 方法发送它。此方法将返回交易哈希。

$transaction = new \Skopa\EthereumWallet\Transaction('recipient address', '2.4')

$res = $contractManager->transfer($transaction);

提醒:交易不是即时操作(根据区块链规范)。

6. 获取交易数据

您可以获取以下ERC20合约交易的数据

  • 发送者地址
  • 接收者地址
  • 合约地址
  • 区块时间戳
  • 代币数量
  • 成功 - 表示交易是否成功(布尔值)

要获取这些数据,您需要在钱包实例上调用 receipt 方法

$receipt = $wallet->receipt('transaction hash');

7. 此外

此外,库中包含一些辅助函数,例如从十进制到十六进制的转换等。您可以在源代码中了解这些。

总结

此库尚未完成,可能包含一些错误和异常。因此,它按“原样”分发。

想要表示感谢,请发送一些代币到以下地址:0xfd9c54573dd27f23d3c8df154bd550df4c44bd8a