PHP와 Ethereum 클라이언트 간의 상호 작용에 대한 자세한 설명
이번에는 PHP 및 Ethereum 클라이언트의 대화형 사용에 대한 자세한 설명을 가져왔습니다. PHP 및 Ethereum 클라이언트의 대화형 사용에 대한 주의 사항은 무엇입니까?
php는 ethereum rpc 서버와 통신합니다
1. Json RPC
Json RPC는 json 기반의 원격 프로시저 호출입니다. 쉽게 말하면 rpc 서버에서 메소드를 호출하기 위한 json 형식의 데이터를 게시하는 것입니다. 일반적으로 다음 항목이 있습니다.
{ "method": "", "params": [], "id": idNumber }
method: 메소드 이름
params: 매개변수 목록
id: 프로시저 호출의 고유 식별 번호
2. Json RPC 클라이언트 빌드
<?php class jsonRPCClient { /** * Debug state * * @var boolean */ private $debug; /** * The server URL * * @var string */ private $url; /** * The request id * * @var integer */ private $id; /** * If true, notifications are performed instead of requests * * @var boolean */ private $notification = false; /** * Takes the connection parameters * * @param string $url * @param boolean $debug */ public function construct($url,$debug = false) { // server URL $this->url = $url; // proxy empty($proxy) ? $this->proxy = '' : $this->proxy = $proxy; // debug state empty($debug) ? $this->debug = false : $this->debug = true; // message id $this->id = 1; } /** * Sets the notification state of the object. In this state, notifications are performed, instead of requests. * * @param boolean $notification */ public function setRPCNotification($notification) { empty($notification) ? $this->notification = false : $this->notification = true; } /** * Performs a jsonRCP request and gets the results as an array * * @param string $method * @param array $params * @return array */ public function call($method,$params) { // check if (!is_scalar($method)) { throw new Exception('Method name has no scalar value'); } // check if (is_array($params)) { // no keys $params = $params[0]; } else { throw new Exception('Params must be given as array'); } // sets notification or request task if ($this->notification) { $currentId = NULL; } else { $currentId = $this->id; } // prepares the request $request = array( 'method' => $method, 'params' => $params, 'id' => $currentId ); $request = json_encode($request); $this->debug && $this->debug.='***** Request *****'."\n".$request."\n".'***** End Of request *****'."\n\n"; // performs the HTTP POST $opts = array ('http' => array ( 'method' => 'POST', 'header' => 'Content-type: application/json', 'content' => $request )); $context = stream_context_create($opts); if ($fp = fopen($this->url, 'r', false, $context)) { $response = ''; while($row = fgets($fp)) { $response.= trim($row)."\n"; } $this->debug && $this->debug.='***** Server response *****'."\n".$response.'***** End of server response *****'."\n"; $response = json_decode($response,true); } else { throw new Exception('Unable to connect to '.$this->url); } // debug output if ($this->debug) { echo nl2br($debug); } // final checks and return if (!$this->notification) { // check if ($response['id'] != $currentId) { throw new Exception('Incorrect response id (request id: '.$currentId.', response id: '.$response['id'].')'); } if (!is_null($response['error'])) { throw new Exception('Request error: '. var_export($response['error'], true)); } return $response['result']; } else { return true; } } } ?>
비교적 간단한 코드이므로 게으른 경우 그냥 사용하세요. packagist.org에 가서 직접 rpc 클라이언트를 찾을 수도 있습니다.
3. RPC를 호출하는 두 가지 유형의 메소드
호출해야 하는 두 가지 유형의 메소드가 있는데, 하나는 RPC 서버 고유의 메소드입니다. 그리고 다른 하나는 계약 방식입니다.
RPC 서버 메소드는 json 형식을 호출합니다
{ "method": "eth_accounts", "params": [], "id": 1 }
RPC 서버에 내장된 메소드 목록
내장 메소드를 호출하는 방법은 비교적 간단합니다. 위 링크를 참조하세요. 대부분 예제가 있습니다.
계약 메소드는 json 형식을 호출합니다.
내장 메소드에서 계약 메소드 eth_call을 호출하는 데 사용해야 합니다. 계약 메소드 이름과 계약 메소드 매개변수 목록은 params를 사용하여 반영됩니다. 계약, json 데이터는 어떻게 구성되어야 할까요?
먼저 getBalanace의 함수 구현을 살펴보세요.
function balanceOf(address _owner) public view returns (uint256 balance)
함수 프로토타입 추출:
balanceOf(address)
geth 콘솔에서 명령을 실행하세요.
web3.sha3("balanceOf(address)").substring(0, 10)
함수 해시 가져오기 "0x70a08231 "
조회할 주소가 address _owner = "0x38aabef4cd283ccd5091298dedc88d27c5ec5750"라고 가정하고, 앞의 "0x"를 제거하고 왼쪽에 24개의 0을 추가합니다(일반 주소 길이는 42비트, '0x' 제거 후 40비트) , 64비트 16진수 매개변수를 구성합니다.
계약 주소가 "0xaeab4084라고 가정할 때 최종 매개변수는 "0x70a082310000000000000000000000038aabef4cd283ccd5091298dedc88d27c5ec57 50"입니다. 194B2a425096fb583Fbcd67385210ac3".
얻은 최종 json 데이터는 다음과 같습니다.
{ "method": "eth_call", "params": [{"from": "0x38aabef4cd283ccd5091298dedc88d27c5ec5750", "to": "0xaeab4084194B2a425096fb583Fbcd67385210ac3", "data": "0x70a0823100000000000000000000000038aabef4cd283ccd5091298dedc88d27c5ec5750"}, "latest"], "id": 1 }
위 json 데이터를 서버는 포스트 모드에서 계약 메소드 "balanceOf"를 호출하여 주어진 주소의 토큰 잔액을 쿼리할 수 있습니다.
계약에서 다른 메소드를 호출하는 경우에도 위의 메소드를 따라야 합니다. :
먼저 코드에서 함수 구현을 살펴보세요.
function transfer(address _to, uint256 _value) public returns (bool)
두 번째로 함수 프로토타입을 추출합니다.
transfer(address,uint256) //注意逗号后面不能有空格
다시 콘솔에서 sha3 함수를 실행합니다.
web3.sha3("transfer(address,uint256)").substring(0, 10)
함수 해시 "0xa9059cbb"를 가져옵니다
The 첫 번째 매개변수는 주소를 _to = "0x38aabef4cd283ccd5091298dedc88d27c5ec5750"으로 가정하고 "0x"로 이동하여 64비트에 0을 추가합니다.
두 번째 uint256 _value = 43776이라고 가정하고 16진수 "0xab00"으로 변환하고 "0x"를 제거하고 0을 추가합니다. 64비트로.
to 계약 주소data 위 연산으로 얻은 16진수- 위 단계를 코드로 변환 .Ethereum RPC 클라이언트 구축
- 코드는 비교적 간단하지만 몇 가지 주의할 점이 있습니다.
- transfer 함수의 값 단위는 10^-18로 매우 작습니다. 1000번 전송하려면 실제로 10의 18승을 곱해야 합니다. 여기서 18은 소수입니다.
{ "method": "eth_call", "params": [{"from": "0x38aabef4cd283ccd5091298dedc88d27c5ec5750", "to": "0xaeab4084194B2a425096fb583Fbcd67385210ac3", "data": "0xa9059cbb00000000000000000000000038aabef4cd283ccd5091298dedc88d27c5ec5750000000000000000000000000000000000000000000000000000000000000ab00"}, "latest"], "id": 1 }
不能使用php自带的dechex函数. 因为dechex要求整型不能大于 PHP_INT_MAX, 而这个数在32位机上为4294967295。由于第1 点, 所有的数都要乘于10的18次方, 所以得到的数要远远大于PHP_INT_MAX. 建议自己实现10进制转16进制,如果你不知道如何实现,参考上述代码。
在运行某些合约方法, 比如transfer时, 要先unlock用户.
发送交易之后, 一定要在服务器端启动挖矿, 这样交易才会真的写入到区块, 比如你调用transfer之后,却发现对方没有到账,先别吃惊,启动挖矿试试。如果想启用自动挖码, 在geth --rpc ...最后加上 --mine.
测试:
<?php var_dump(EthereumRPCClient::personal_newAccount(['password'])); var_dump(EthereumRPCClient::personal_unlockAccount([EthereumRPCClient::COINBASE, "password", 3600]); var_dump(EthereumRPCClient::getBalance("0x...."));
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
PHP使用file_get_contents发送http请求步骤详解
위 내용은 PHP와 Ethereum 클라이언트 간의 상호 작용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.
