PHP
Blockchain
NEM

PHPでXEMを送金してみる

PHPでNEMを取り扱う必要があったので、TestnetでXEMを送るところまで検証してみました。
※最近、NEM2(Catapult)の話ばかりしていましたが、今回の話は現行NEMの話です。

ライブラリの導入

今回は、nem-phpを使ってみました。
ライブラリはcomposerを使ってインストールしましたが、kornrunner/keccakdev-masterに依存しているらしく、requireにevial/npm-phpだけ指定しただけではうまくインストールできないので、注意が必要です。
composer.jsonは以下のような感じになります。

{
    "name": "daoka/nem-php-sample", // 任意の名前を設定
    "require": {
        "kornrunner/keccak": "dev-master",
        "evias/nem-php": "^0.2.11"
    },
    "autoload": {
        "psr-4": {
            "NemPhpSample\\": "src/" // 任意の名前に変えておく
        }
    }
}

XEMを送金してみる

以下のソースコードを参照。

<?php

require_once("vendor/autoload.php");

$nemAPI = new NEM\API();
$nemAPI->setOptions([
    "protocol" => "http",
    "use_ssl" => false,
    "host" => "192.3.61.243",
    "port" => 7890,
    "endpoint" => "/",
]);

$sdk = new NEM\SDK([], $nemAPI);

$privateKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$keypair = new NEM\Core\KeyPair($privateKey);

// 送信したいメッセージを指定
$message = new NEM\Models\Message();
$message->setPlain("hogehoge");

// TimeStampはUNIXタイムからnemesisタイムを引いた値にする
$timeStamp = time() - NEM\Models\TimeWindow::$nemesis;
// deadlineはtimeStampから24時間以内の時間を指定する
$deadline = $timeStamp + 24 * 60 * 60;

$txData = [
    "timeStamp" => $timeStamp,
    "deadline" => $deadline,
    // トランザクションのタイプを指定する
    "type" => NEM\Models\TransactionType::TRANSFER,
    "amount" => 1000000, // マイクロXEMで指定する
    "message" => $message,
    // 送信先アドレス
    "recipient" => "TXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    // メインネットなのか、テストネットなのか、モザイク添付ありなので変わる
    "version" => NEM\Models\Transaction::VERSION_1_TEST
];

// トランザクションのモデルを生成
$transferTx = NEM\Models\Transaction::create($txData);

$service = $sdk->transaction();

// 送信するアカウントの秘密鍵で署名して、ネットワークに流す。
$result = $service->announce($transferTx, $keypair);
var_dump($result);