어제는 테스트망에 Web3와 ABI를 이용해서 접근하는 방법을 알아봤습니다. 이어서 오늘은 로컬에 설치되어 있는 Geth 노드로 가상 사설 네트워크를 구축하고 여기에 Web3.js를 이용하여 접근하는 방법을 알아보도록 하겠습니다.

아마도 이 방법이 실제 지갑 프로그램을 만들 수 있는 방법이겠지요.

일단 Geth를 이용하여 사설 네트워크를 구축합니다.

사설 네트워크 구축 관련해서는 아래 게시물을 확인하시고 Geth 프로그램을 실행해 주시면 됩니다.

uoops7coin.tistory.com/6

 

이더리움 DApp Web3로 접근하기

이번에는 이더리움 테스트망에 콘트랙트를 생성하고 Web3와 ABI 인터페이스를 이용해서 접근해 보도록 하겠습니다. Rinkeby 테스트망을 이용하도록 하겠습니다. ​ [참조] Web3.js는 DApp에 접근하기

uoops7coin.tistory.com

 

Geth 관련 준비가 되면 Geth 사설 네트워크를 시작합니다. 사실 Geth만 준비가 되면 추가적으로 할 것이 없습니다.

geth.exe --nodiscover --identity "etherPrivate" --datadir "C:\Program Files\Geth\mydata" --rpc --rpccorsdomain "*" --networkid 88 --rpcapi "admin,db,eth,net,web3,debug,miner,shh,txpool,personal" console

이번에는 MetaMask를 사용하지 않습니다. 아래와 같이 HTML 파일을 하나 만듭니다. HTTP 서버에서 실행해도 되지만 로컬에서 파일로 직접 실행해도 상관이 없습니다.

[HTML 파일 내용]

<!DOCTYPE html>

<html>

<head>

  <meta charset="utf-8">

  <title>사설 네트워크로 Web3.js 접근</title>

</head>

​

<script src="https://cdn.rawgit.com/ethereum/web3.js/develop/dist/web3.js"></script>

// 이 부분은 Web2.js를 참조하도록 선언하는 부분입니다.

​

<body>

* 계정 주소: <span id="account_addr"></span><br>

* 보유 코인 수량: <span id="account_balance"></span><br><br>

* 수신 주소: <input id="to_addr" type="text" style="width: 400px;" value="0x67bb275399af1746055d1cfd841a195d1d2f6936"><br>

* 보낼 코인 수: <input id="to_count" type="text" style="width: 100px;"><br><br>

* 수신인 코인 수: <span id="to_balance"></span><br>

* TXID: <span id="to_txid"></span><br><br>

<button onclick="send()">전송</button>

<button onclick="location.reload();">확인</button>

// 위 부분들은 화면에 그리는 부분이구요. 브라우저에서 파일을 열면 아래와 같은 화면이 됩니다.

 

<script>

  // 여기가 스크립트 시작 부분이구요.

  var Web3 = require("web3");

  var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); 

​

  // web3 인터페이스를 선언하는 부분입니다. Port는 자신이 설정한 포트를 사용하시면 됩니다.

  var sender_addr;

  var balance_wei;

  var balance_eth;

  var to_addr = "0x67bb275399af1746055d1cfd841a195d1d2f6936";

​

  // 각 변수 선언이구요, 수신 받을 주소는 임의로 일단 선언해 뒀습니다.

  // 화면이 열릴 때 수행합니다.

  getAccount();

  

  function getAccount() {

  web3.eth.getAccounts(function(err,r){

     document.getElementById('account_addr').innerHTML = r[0];

  sender_addr = r[0];

  to_addr = r[1];

  // getAccounts 함수를 호출하여 첫 번째 사용자와 두 번째 사용자의 계정 주소를 가져오고 

​

  getBalance(sender_addr);

  getBalanceTo(to_addr);

  // 발신자와 수신자의 현재 보유 수량 정보를 가져와 표시해 줍니다.

​

  unlockAccount();

    // 발신자가 코인을 보낼 수 있도록 권한을 득합니다.

  });

  }

  

  // unlockAccount 함수로 발신자가 코인 발송이 가능하게 하는 함수입니다.

  function unlockAccount() {

  web3.personal.unlockAccount(sender_addr.toString(), "1", function(err,r){

  console.log(r);

  });  

  }

​

  // getBalance 함수를 호출하여 발신자의 코인 보유 수량을 확인합니다.

  function getBalance(sender_addr) {

  web3.eth.getBalance(sender_addr, function(err, r) {

  balance_wei = r;

  balance_eth = web3.fromWei(balance_wei, "ether");

     document.getElementById('account_balance').innerHTML = balance_eth;

     console.log(balance_eth);

  });

  }

​

  // getBalance 함수를 호출하여 수신자의 코인 보유 수량을 확인합니다.  

  function getBalanceTo(to_addr) {

  web3.eth.getBalance(to_addr, function(err, r) {

  balance_wei = r;

  balance_eth = web3.fromWei(balance_wei, "ether");

     document.getElementById('to_balance').innerHTML = balance_eth;

     console.log(balance_eth);

  });

  }

​

  // 코인 전송을 클릭하면 코인을 전송합니다.

  function send() {

  var tmp_to_addr = document.getElementById('to_addr').value;

  if (tmp_to_addr == "") {

  tmp_to_addr = to_addr;

  }

  

  var tmp_send_count = document.getElementById('to_count').value;

  if (tmp_send_count == "") {

  alert("수량을 입력하세요");  

  }

  

    // 발송 시 단위를 ETHER 단위로 변경합니다.

  tmp_send_count = web3.toWei(tmp_send_count, "ether");

  

    // 발신자로부터 수신자에게 지정된 코인을 전송합니다.

  web3.eth.sendTransaction({

      from: sender_addr,

      to: tmp_to_addr,

      value: tmp_send_count

  }, function(error, hash){

  getBalanceTo(tmp_to_addr);

     document.getElementById('to_txid').innerHTML = hash;

     console.log(hash);

  });

  }

</script>

</body>

수행을 해 보겠습니다. 코인 수량을 입력 후 [전송]을 클릭합니다.

그러면 트랜잭션이 일어나고 그 값을 얻을 수 있습니다.

채굴이 진행되지 않고 있기 때문에 Geth는 처리 준비 상태가 됩니다.

Geth 콘솔에 채굴 시작 명령을 입력합니다.

> miner.start(1)

그러면 채굴이 시작되고 트랜잭션이 처리됩니다. 잠시 기다렸다가 채굴을 중지합니다.

> miner.stop()

[확인]을 클릭하면 현재 코인 전송 상태가 변경됩니다.

[참조] 소스는 아래 링크를 클릭하세요.

https://github.com/uoops7/erc20/blob/master/web1.html

 

uoops7/erc20

Contribute to uoops7/erc20 development by creating an account on GitHub.

github.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기