/web3.php

A PHP interface for interacting with the Ethereum blockchain and ecosystem. Native ABI parsing and smart contract interactions.

Primary LanguagePHPMIT LicenseMIT

web3.php

PHP Licensed under the MIT License

A PHP interface for interacting with the Ethereum blockchain and ecosystem.

Inspired by the great work of all previous contributors on web3p/web3.php

Install

Add this to your composer.json

    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/thtg88/web3.php"
        }
    ],
    "require": {
        "web3p/web3.php": "dev-master"
    }

Then execute the following from terminal

composer require web3p/web3.php

Usage

New instance

use Web3\Web3;

$web3 = new Web3('http://localhost:8545');

Using provider

use Web3\Web3;
use Web3\Providers\HttpProvider;
use Web3\RequestManagers\HttpRequestManager;

$web3 = new Web3(new HttpProvider(new HttpRequestManager('http://localhost:8545')));

// timeout
$web3 = new Web3(new HttpProvider(new HttpRequestManager('http://localhost:8545', 0.1)));

You can use callback to each rpc call:

[$err, $version] = $web3->clientVersion();

if ($err !== null) {
    // do something
    return;
}

echo 'Client version: ' . $version;

Eth

use Web3\Web3;

$web3 = new Web3('http://localhost:8545');
$eth = $web3->eth;

Or

use Web3\Eth;

$eth = new Eth('http://localhost:8545');

Net

use Web3\Web3;

$web3 = new Web3('http://localhost:8545');
$net = $web3->net;

Or

use Web3\Net;

$net = new Net('http://localhost:8545');

Batch

web3

[$errors, $data] = $web3->batch()
    ->clientVersion()
    ->hash('0x1234')
    ->execute();

if ($errors !== null) {
    // do something
    // it may throw exception or array of exception depends on error type
    // connection error: throw exception
    // json rpc error: array of exception
    return;
}

// do something

eth

$eth->batch()
    ->protocolVersion()
    ->syncing()
    ->execute();

if ($errors !== null) {
    // do something
    return;
}

// do something

net

$net->batch()
    ->version()
    ->listening()
    ->execute();

if ($errors !== null) {
    // do something
    return;
}

// do something

personal

$personal->batch()
    ->listAccounts()
    ->newAccount('123456')
    ->execute();

if ($errors !== null) {
    // do something
    return;
}

// do something

Contract

use Web3\Contract;

$contract = new Contract('http://localhost:8545', $abi);

// deploy contract
$contract->bytecode($bytecode)->new($params, $callback);

// call contract function
$contract->at($contractAddress)->call($functionName, $params, $callback);

// change function state
$contract->at($contractAddress)->send($functionName, $params, $callback);

// estimate deploy contract gas
$contract->bytecode($bytecode)->estimateGas($params, $callback);

// estimate function gas
$contract->at($contractAddress)->estimateGas($functionName, $params, $callback);

// get constructor data
$constructorData = $contract->bytecode($bytecode)->getData($params);

// get function data
$functionData = $contract->at($contractAddress)->getData($functionName, $params);

Assign value to outside scope(from callback scope to outside scope)

$newAccount = '';

[$err, $account] = $web3->personal->newAccount('123456');

if ($err !== null) {
    echo 'Error: ' . $err->getMessage();
    return;
}

$newAccount = $account;
echo 'New account: ' . $account . PHP_EOL;

Examples

To run examples, you need to run ethereum blockchain local (testrpc).

You can use Ganache to set up a testchain and expose it on port 8545

Develop

Local php cli installed

  1. Clone the repo and install packages.
git clone https://github.com/thtg88/web3.php.git && cd web3.php && composer install
  1. Start Ganache workspace on port 8545

  2. Change testHost in TestCase.php

/**
 * testHost
 *
 * @var string
 */
protected $testHost = 'http://127.0.0.1:8545';
  1. Run test script
vendor/bin/phpunit

API

Todo.

License

MIT