Spent several hours today figuring out how to interact with an ElectrumX server, and it resulted into just several lines of code. I hope this will save someone time. I will show 2 versions – for TCP and SSL connection to ElectrumX server.
Here is the TCP one:
<?php
// Preparing a TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// connecting to your socket
socket_connect($socket, "localhost", 47001);
// Here is a sample JSON query
$query='{"id": "blk", "method": "blockchain.estimatefee", "params":["5"]}';
// Sending query to server
socket_write($socket, $query."\n");
// Receiving result from your query (I think it should not exceed 10 Kb)
socket_recv($socket, $value, 10240, MSG_PEEK);
$result=json_decode($value);
print_r($result);
socket_close($socket);
?>
If you prefer to connect to your server with SSL (I suppose you have a self-signed certificate), here is your code:
<?php
// Defining host, port, and timeout
$host = '127.0.0.1';
$port = 47002;
$timeout = 30;
// Setting context options
$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
stream_context_set_option($context, 'ssl', 'verify_peer_name', false);
// JSON query for fee estimation in 5 blocks
$query='{"id": "blk", "method": "blockchain.estimatefee", "params":["5"]}';
if ($socket = stream_socket_client('ssl://'.$host.':'.$port, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context)
) {
fwrite($socket, $query."\n");
$value=fread($socket,10240);
$result=json_decode($value);
print_r($result);
fclose($socket);
} else {
echo "ERROR: $errno - $errstr\n";
}
?>
Both scripts are doing the same. You should get something like this in the output:
stdClass Object
(
[jsonrpc] => 2.0
[result] => 0.00106033
[id] => blk
)