반응형

이더리움 토큰을 php로 전송하는걸 해보자...


curl을 이용해 이더리움 서버에 접속한뒤 json rpc를 이용해 전송해본다...


<?php

$number=2000000;

$number = $number.'000000000000000000';

$number=gmp_init($number,10);

$number16=gmp_strval($number, 16);


?>


토큰은 16진수다. 게다가 0을 18개정도 붙이고 16진수로 바꿔줘야한다...(토큰마다 다르다 8개를 붙이기도 하고 18개를 붙이기도 한다. etherscan에서 조회하면 나온다.)


이렇다보니 위처럼 2백만개 정도 보내려고 해보면 숫자가 정확히 맞지 않는 문제가 발생한다..


왜냐면 php는 그렇게 큰 수를 인식하지 못하기 때문이다.


그래서 gmp라는 모듈을 설치해서 작업해야한다.


gmp는 검색해서 알아보자...(우분투는 설치가 쉬운데 centos는 어렵더라)


위처럼 보내려고 하는 토큰의 갯수에 0을 18개 붙인뒤 16진수로 변환한 숫자를 $number16에 넣는다...



<?php


$numLen=strlen($number16);

$zeroCnt=64-$numLen;

$zero=str_repeat("0",$zeroCnt);

$sendAmount=$zero.$number16;


$toAddr="F74e1064E12c725Ab4c18764bEE5c5daCd3482Bd";

$sendData = "0xa9059cbb000000000000000000000000".$toAddr.$sendAmount;

$contractAddr="0x999312ca356d8997815876216e1971e2c47e4a4f";


$data='{"jsonrpc": "2.0", "id": 1, "method": "eth_sendTransaction", "params": [{"from":"0xb62fe1acc555d8cc6075c25db8f33612791abd49", "to":"'.$contractAddr.'", "gas": "0x11170", "value":"0x0", 

"data":"'.$sendData.'"}]}';


?>


이렇게 만들어준다...


여기서 $sendData의 "0xa9059cbb"는 https://tokenstandard.codetract.io/ 요기서 확인가능하다...


뒤에 0은 24개다...


그리고..


<?php


function json_rpc($data){


$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://0.0.0.0:8545");

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

curl_setopt($ch, CURLOPT_POST, true);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

return curl_exec($ch);

}


$output=json_decode(json_rpc($data));


echo "<pre>";

print_r($output);


?>


위 함수에 던져준다...물론 테스트 서버다...각자의 이더 서버 주소를 넣어주면 된다...


전송확인은 etherscan에서 해보자...


이더스캔 api는 


https://api-rinkeby.etherscan.io/api?module=account&action=tokenbalance&contractaddress=0x999312ca356d8997815876216e1971e2c47e4a4f&address=0xf74e1064e12c725ab4c18764bee5c5dacd3482bd&tag=latest&apikey=PU4J188DZWU72TAM9DGCC9K5VWHEXHKXQC


이렇게 확인가능하다...물론 테스트넷이다...rinkeby에서 작업했다..

반응형

+ Recent posts