geth์ฝ์์ ์ด์ฉํด์ ๋ฐฐํฌํ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ web3.js๋ฅผ ์ด์ฉํ๋ฉด ์น์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. web3.js๋ ์ด๋๋ฆฌ์์์ ์ ๊ณตํ๋ javascrript API์ ๋๋ค.
ํด๋น ๋งํฌ๋ก ๊ฐ์ web3.min.js๋ฅผ ๋ค์ด๋ฐ์ต๋๋ค. ์ด ๋ฒ์ ์ฌ์ฉํ web3.js ๋ฒ์ ์ 0.20.6 ์ ๋๋ค. https://github.com/ethereum/web3.js/tree/v0.20.6/dist
ํด๋น ํ์ผ ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋์์ผ๋ฉด test.html๋ก ์๋ํฐ๋ก ๋ฌธ์๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ๋จผ์ ํด์ผํ ๊ฑด web3.min.js๋ฅผ html๋ฌธ์์ ํฌํจ์ํค๋ ๊ฒ๋๋ค.
<!DOCTYPE html>
<html>
<head>
<meta charset=โUTF-8โ>
<title>web3 test</title>
<script type=โtext/javascriptโ src=โweb3.min.jsโ></script>
</head>
<body>
</body>
</html>
์ฌ๊ธฐ๊น์ง ์๋ฃํ๊ณ test.html๋ฌธ์๋ฅผ ์ด์ด์ ์๋ฌ ๋ฌธ๊ตฌ๊ฐ ๋ํ๋์ง ์์ผ๋ฉด web3.min.js ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ก๋ฉ์ด ์๋ฃ๋๊ฒ๋๋ค. ๊ทธ๋ผ web3๋ฅผ ์ด์ฉํด์ geth์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. (geth๊ฐ ์คํ์ค์ด์ฌ์ผ ํฉ๋๋ค!!!!!!!!!!!!!!!!)
web3.min.js๋ฅผ ๋ถ๋ฌ์ค๋ ํ๊ทธ ๋ฐ์ scriptํ๊ทธ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
<head>
<meta charset=โUTF-8โ>
<title>web3 test</title>
<script type=โtext/javascriptโ src=โweb3.min.jsโ></script>
<script type=โtext/javascriptโ>
var Web3 = require(โweb3โ);
var web3 = new Web3( new Web3.providers.HttpProvider(โhttp://localhost:8545โ));
var network_version = web3.version.network;
console.log(network_version);
</script>
</head>
var Web3 = require(โweb3โ) ๋ web3๋ชจ๋์ ๋ก๋ฉํด์ ๋ณ์ Web3์ ํ ๋นํ๋ ๊ตฌ๋ฌธ์
๋๋ค.
var web3 = new Web3()๋ web3 ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ณ์ web3์ ํ ๋นํ๋ ๊ตฌ๋ฌธ์ด๋ฉฐ new Web3()์์ ์ฝ์
๋ ๊ตฌ๋ฌธ์ web3๊ฐ์ฒด์ geth์ฝ์๊ณผ ์ฐ๊ฒฐํ๋ ๊ตฌ๋ฌธ์
๋๋ค.
new Web3.providers.HttpProvider(โhttp://localhost:8545โ)
HttpProviderํจ์๋ฅผ ์ฌ์ฉํด์ geth์ ์ฐ๊ฒฐํ๋ฉฐ ํ๋ผ๋ฏธํฐ๋ก ์ฐ๊ฒฐํ๊ณ ์ถ์ geth์ ๋๋ฉ์ธ๊ณผ rpc port๋๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. geth๋ฅผ ์คํํ ๋ rpc port๋ฅผ ๋ช ์ํ์ง ์์์ผ๋ฉด 8545๊ฐ ์ค์ ๋ฉ๋๋ค.
geth์ ์ ์ฐ๊ฒฐ์ด ๋๋์ง web3๋ฅผ ์ด์ฉํด์ ์ฐ๊ฒฐ๋ geth์ network ์ ๋ณด๋ฅผ ์ถ๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
var network_version = web3.version.network;
console.log(network_version);
์๋์ ๊ฐ์ด geth ์ต์ ์์ ์ฌ์ฉํ ๋คํธ์ํฌ ์์ด๋๊ฐ ์ถ๋ ฅ๋๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
web3์ geth ์ฐ๊ฒฐ์ ํ์ธํ์ผ๋ web3๋ฅผ ์ด์ฉํด์ ์ด๋๋ฅผ ์ ์กํด๋ณด๊ฒ ์ต๋๋ค. web3.eth.accounts ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐ๊ฒฐ๋ geth์ ๋ชจ๋ ๊ณ์ข์ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
web3.eth.sendTransaction()ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋์ญ์
์ ์คํ์ํฌ ์์์ต๋๋ค.
sendTransactionํจ์๋ Transacton Object์ callbackํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ต๋๋ค.
Transaction Object๋ ์ด๋๋ฅผ ์ ์กํ from, ์ด๋๋ฅผ ๋ฐ์ to, ์ ์กํ ์ด๋์ ์ value ์ ๋ช
์ํด์ฃผ๋ฉด ๋ฉ๋๋ค. (๊ทธ ์ธ์ gas, gasPrice, nonce, data ๋ฅผ ์ต์
์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.)
์ฒซ ๋ฒ์งธ ๊ณ์ข์์ ๋ ๋ฒ์งธ ๊ณ์ข๋ก 1000 wei๋ฅผ ๋ณด๋ด๊ฒ ์ต๋๋ค.
<script type=โtext/javascriptโ>
var Web3 = require(โweb3โ);
var web3 = new Web3( new Web3.providers.HttpProvider(โhttp://localhost:8545โ));
var network_version = web3.version.network;
console.log(network_version);
var accounts = web3.eth.accounts; //account ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
var from_account = accounts[0];
var to_account = accounts[1];
var transactionObj = { //transaction object ์ค์
from: from_account,
to:to_account,
value: 1000
};
web3.eth.sendTransaction(transactionObj)
</script>
์ด๋ ๊ฒ ์์ฑ์ ํ๊ณ ์คํ์ ์ํค๊ธฐ ์ ์ geth์์ ์ฒซ ๋ฒ์งธ ๊ณ์ข์ ๋ฝ์ ํ์ด์ค์ผ ํฉ๋๋ค. geth ์ฝ์์ฐฝ์์
personal.unlockAccount(eth.accounts[0])
๋ฅผ ์
๋ ฅํด์ ๋ฝ์ ํ์ด์ค ํ์ html๋ฌธ์๋ฅผ ์คํ์ํต๋๋ค.
์! ๋ง์ด๋๋ ์คํ์์ผ์ค์ผ ํฉ๋๋ค!!!!! geth ์ฝ์์ฐฝ์์ miner.start()๋ฅผ ์
๋ ฅํฉ๋๋ค.
๋ง์ด๋์ด ๋์ผ๋ฉด geth์ฝ์์ฐฝ์์ eth.getBalance(eth.accounts[1])์ ์คํํด์ ์ ๋๋ก ์ํ๋๋์ง ํ์ธํด๋ณด๋ฉด ๋ฉ๋๋ค!
web3๋ฅผ ์ด์ฉํด์ private network์ ๋ฐฐํฌ๋ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. solc ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํด์ geth์์ ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์ฌ์ฉํ ๋ ์์์ผํ ์ ๋ณด๊ฐ ๋ ๊ฐ์ง ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์ปจํธ๋ํธ์ abi, ๋ ๋ฒ์งธ๋ ๋ฐฐํฌ๋ ์ปจํธ๋ํธ์ ์ฃผ์!
web3์์๋ ์ด ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํด์ ์ปจํธ๋ํธ์ ์ฐ๊ฒฐํฉ๋๋ค. 5๋ฒ์งธ ๊ธ(https://busy.org/@pangol/dapp-5-solc) ์์ ๋ฐฐํฌํ ์ปจํธ๋ํธ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
<script type=โtext/javascriptโ>
var Web3 = require(โweb3โ);
var web3 = new Web3( new Web3.providers.HttpProvider(โhttp://localhost:8545โ));
var from_account = accounts[0];
//contract abi ์ค์
var contractAbi = [{"constant":false,"inputs":[{"name":"_data","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}];
//๋ฐฐํฌ๋ ์ปจํธ๋ํธ ์ฃผ์ ์ค์
var contractAddress = "0x2a2d085b683c995e5155260d044db06d117fb666";
var contract = web3.eth.contract(contractAbi);
var contractInstance = contract.at(contractAddress);
var result = contractInstance.get()
console.log(result.toString());
</script>
abi์ ์ฃผ์๋ฅผ ์ค์ ํ ํ web3.eth.contract()์์ abi๋ฅผ ์ธ์๋ก ๋๊ธฐ๊ณ ์ปจํธ๋ํธ๋ฅผ ์ธํฐํ์ด์ค๋ฅผ ์ค์ ํ๊ณ contract.at()ํจ์๋ฅผ ์ฌ์ฉํด์ ์ปจํธ๋ํธ์ ์ธ์คํด์ค๋ฅผ ํ ๋น ๋ฐ์ต๋๋ค. ๊ทธ๋ผ ๋ฐฐํฌ๋ ์ปจํธ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. get()์ ์ด์ฉํด์ data์ ์ ์ฅ๋ ์ซ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
web3.js์์๋ bignumber ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์ซ์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ result.toString() ๋๋ result.toNumber()๋ฅผ ๋ถ์ด์ง ์๊ณ result๋ง ์ถ๋ ฅํ๊ฒ ๋๋ฉด ์ซ์๊ฐ ์๋ ๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋๋ ์ ์ํ์๊ธฐ ๋ฐ๋๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ปจํธ๋ํธ์ setํจ์๋ฅผ ์ฌ์ฉํด์ ์ปจํธ๋ํธ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํด๋ณด๊ฒ ์ต๋๋ค. setํจ์๋ getํจ์์ ๋ค๋ฅด๊ฒ ๋ณ์์ ๊ฐ์ ๋ณํ์ํค๊ธฐ ๋๋ฌธ์ transaction object๋ฅผ ์ธ์๋ก ๊ฐ์ด ๋๊ฒจ์ค์ผ ํฉ๋๋ค.
contractInstance.set(1000, {from:eth.accounts[0]})
transaction์ ์ ์กํ๊ธฐ ๋๋ฌธ eth.accounts[0]์ ๋ฝ์ด ํ๋ฆฐ ์ํ์ฌ์ผ ํฉ๋๋ค. ๋ง์ด๋์ ํ ํ, ๊ฐ์ ํ์ธํด๋ณด๋ฉด ๋ณ๊ฒฝ๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
web3์ ๋ํด์ ์์ธํ ์๊ณ ์ถ์ ๋ถ์ https://github.com/ethereum/wiki/wiki/JavaScript-API ์์ ํ์ธํด๋ณด์๋ฉด ๋ฉ๋๋ค.