์ดํ์ธํด๋ฝ์ ๋๋ค. ์ด๋๋ฆฌ์์ ํต์ฌ ๊ฐ๋ ์ธ ์ค๋งํธ ์ปจํธ๋ํธ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ด์ ๊ธ - [Smart Contract ๊ฐ๋ฐ] #5 ์ด๋๋ฆฌ์ ๊ฐ๋ฐ ๊ด๋ จ ์ฑ ๋ฐ ๊ฐ๋ฐ ์๋ฃ ์๊ฐ
์ด์ ์ ์ฌ๋ฆฐ ์ฐธ๊ณ ์์ (๋ธ๋ก์ฒด์ธ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ ์ค์ ์
๋ฌธ)์ ๋ณด๋ฉด์ ์ด๋๋ฆฌ์์ ํต์ฌ ๊ฐ๋
์ด ์ค๋งํธ ์ปจํธ๋ํธ์ ๊ฐ๋
๋ฐ
๋์๋ฐฉ์์ด ์ข
๊ฒฐ๋์์ต๋๋ค!
์ต๊ทผ์ @feyee95๋๋ ์ค๋งํธ ์ปจํธ๋์ ๊ฐ๋
์ ๋ํด์ ์ฌ๋ ค์ฃผ์
จ์ต๋๋ค.
[์ด๋๋ฆฌ์] ๋ธ๋ก๊ณผ ๊ณ์ฝ์ ์ฐ๊ฒฐ(์ค๋งํธ ์ปจํธ๋ํธ)
๋ด์ฉ์ ์ฌ์ด ์๋ฅผ ๋ค์ด ์ค๋ช ํด ์ฃผ์ จ๋๋ฐ, ํ๊ฐ์ง ์ค๋งํธ ์ปจํธ๋ํธ๊ฐ ๋ธ๋ฝ์ฒด์ธ ์์์ ์ด๋ป๊ฒ ๋์ํ๋์ง๋ ๋ชจํธํ ๋ฉด์ด ์์์ต๋๋ค. ์ ๋ ๊ทธ๋์ ์ค๋งํธ ์ปจํธ๋ํธ๋ ๊ฐ์ธ ๊ณ์ (Externally Owned Account)๊ณผ ๋ฌ๋ฆฌ Smart Contact์ ๊ณ์ ์ด ์๋ค๊ณ ํ๋ ํ๋์ ๋ ธ๋ ์ฒ๋ผ ์ธ์์ ํ๊ณ ์์์ต๋๋ค.
์๋ ๊ทธ๋ฆผ์ผ๋ก ํ ๋ฒ ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค.
[์ถ์ฒ: ๋ธ๋ก์ฒด์ธ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ ์ค์ ์
๋ฌธ]
์ ๊ทธ๋ฆผ์ ๋จ์ํ ์ค๋งํธ ์ปจํธ๋ํธ ์ค๋ช ๋ง์ ์ํ ๊ทธ๋ฆผ์ด ์๋๋๋ค. ๋ธ๋ฝ์ฒด์ธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ์ผ๋ฐ ์ฌ์ฉ์๋ค์ด ์ด๋ป๊ฒ ๋ธ๋ฝ์ฒด์ธ์ ์ ๊ทผํ๊ณ , ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์ฌ์ฉํ๋์ง ์ค๋ช ํด ์ฃผ๋ ๋งค์ฐ ์์คํ ๊ทธ๋ฆผ์ ๋๋ค.
์ ๊ทธ๋ฆผ ์ผํธ์ ๋ณด๋ฉด ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์๋ ์ด๋๋ฆฌ์ ๋ธ๋ฝ์ฒด์ธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ์ด๋๋ฆฌ์ ๋ธ๋ฝ์ฒด์ธ ๋ฐ์ดํฐ๋ ์๋ฐฑ GB๋ฐ์ดํฐ ์ด๋ฉฐ, ๋ธ๋ฝ์ฒด์ธ์ ๋ ธ๋๋ก ๋์ํ๊ธฐ ์ํด์๋ ๊ณ์ ๋ธ๋ฝ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ์ ์ฑํฌ๋ฅผ ๋ง์ถฐ์ผ ํฉ๋๋ค. ๊ทธ๋์ ์ผ๋ฐ ์ฌ์ฉ์๋ ๋ธ๋ฝ์ฒด์ธ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ์ฅํ์ง ์๊ณ , ์ผ์ข ์ ์๋ฒ์ ๊ฐ์ ์ญํ ์ ํ๋ ๋ ธ๋์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด ๋ ์น ๋ธ๋ผ์ฐ์ ๋ ssh์ ๊ฐ์ ์๋น์ค๋ฅผ ์ด์ฉํ๊ฒ ๋๋ ๊ฒ์ด์ฃ .
๊ทธ๋ฆผ ์ค์์ ๋ํ๋ ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ ์ด๋๋ฆฌ์ ๋ธ๋ฝ์ฒด์ธ์ ์ฐธ์ฌํ๋ ๋ ธ๋์ ๋๋ค. ์ฆ ๋ธ๋ฝ์ด ์์ฑ๋๋ฉด ๊ทธ ์ ๋ณด๋ฅผ ์ ํ ๋ฐ๋ ์ญํ ์ ํ๋ ๊ฒ์ด์ฃ . ๋ฐ๋ผ์, ์ฑํฌ๋ ๋ธ๋ฝ์ฒด์ธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค. ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ ๋ธ๋ฝ์ฒด์ธ ๋คํธ์ํฌ์ ๋ ธ๋์ด๋ฉด์, ์ผ๋ฐ ์ฌ์ฉ์์ ์ ์์ ํ์ฉํ๊ณ ๋ธ๋ฝ์ฒด์ธ๊ณผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์ญํ ๋ ๋ด๋นํฉ๋๋ค. ๊ทธ๋์ ์ผ๋ฐ ์ฌ์ฉ์๋ ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ, ์ฆ ๋ ธ๋์ ์ ์ํ์ฌ geth์ ๊ฐ์ ๋ช ๋ น์ด๋ก ๋ธ๋ฝ์ฒด์ธ ์ ๋ณด๋ฅผ ์ป๊ฑฐ๋, ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ ๋ธ๋ฝ์ฒด์ธ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ ์ฌ์ฉ์๊ฐ ์์ฑํ ์ค๋งํธ ์ปจํธ๋ํธ๋ ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ฅผ ํตํด์ ๋ธ๋ฝ์ ํฌํจ๋๊ณ , ๊ฒฐ๊ตญ ๋ธ๋ฝ์ฒด์ธ์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ ๋ด์ฉ์ด ์ ๊ทธ๋ฆผ์ ์ค๋ฅธํธ์ ๋ํ๋ ์์ต๋๋ค. ํ ์ฌ์ฉ์๊ฐ ์์ฑํ ์ค๋งํธ ์ปจํธ๋ํธ ์ฝ๋๊ฐ ๋ธ๋ฝ์ ๊ธฐ๋ก๋์ด ๋ค๋ฅธ ๋ ธ๋์์๋ ์ฝ๋๊ฐ ๋ณต์ฌ๋ ๊ฒ์ด์ฃ . ๊ทธ๋์ ๊ฐ ๋ ธ๋์ EVM์์ ์ฝ๋๋ฅผ ์คํ์ํฌ ์๊ฐ ์์ต๋๋ค!
์ ๋ด์ฉ์ ์ค์ ์๋ฅผ ๋ค์ด์ ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์์๋ณด๊ฒ ์ต๋๋ค. ์ ๋ฐ๋ผ์ค์๋ฉด, ์ด๋๋ฆฌ์ ์ค๋งํธ ์ปจํธ๋ํธ ๊ฐ๋ ์ ์ข ๊ฒฐ์ํฌ ์ ์์ต๋๋ค!
์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ง๋๋ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ๋จํ ์ค๋งํธ ์ปจํธ๋ํธ์ ์๋ก ์๋ผ์ ๊ฐ์ด ์ฝ๋ฉํฉ๋๋ค. ๋จ์ํ ๊ณต์ฉ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ , ์ฝ๋ ๊ธฐ๋ฅ์ ๋ํ ๊ตฌํ์ ๋๋ค.
pragma solidity ^0.4.8; // (1) ๋ฒ์ ํ๋ผ๊ทธ๋ง
// (2) ๊ณ์ฝ ์ ์ธ
contract HelloWorld {
// (3) ์ํ ๋ณ์ ์ ์ธ
string public greeting;
// (4) ์์ฑ์
function HelloWorld(string _greeting) {
greeting = _greeting;
}
// (5) ๋ฉ์๋ ์ ์ธ
function setGreeting(string _greeting) {
greeting = _greeting;
}
function say() constant returns (string) {
return greeting;
}
}
์ ์ฝ๋๋ฅผ ์๋ฆฌํฐํฐ ์ปดํ์ผ๋ฌ๋ก ์ปดํ์ผ ํ๋ฉด ์๋์ ๊ฐ์ EVM ๋ฐ์ดํธ ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค. ์ปดํ์ผ์ remix๋ geth์ solidity ์ปดํ์ผ๋ฌ๋ก ํ ์ ์์ต๋๋ค. ์ด ๋ถ๋ถ์ ์๋ตํฉ๋๋ค.
0x6060604052341561000f57600080fd5b60405161046d38038061046d833981016040528080519091019050600081805161003d929160200190610044565b50506100df565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061008557805160ff19168380011785556100b2565b828001600101855582156100b2579182015b828111156100b2578251825591602001919060010190610097565b506100be9291506100c2565b5090565b6100dc91905b808211156100be57600081556001016100c8565b90565b61037f806100ee6000396000f3006060604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663954ab4b2811461005b578063a4136862146100e5578063ef690cc014610138575b600080fd5b341561006657600080fd5b61006e61014b565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100aa578082015183820152602001610092565b50505050905090810190601f1680156100d75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156100f057600080fd5b61013660046024813581810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506101f495505050505050565b005b341561014357600080fd5b61006e61020b565b6101536102a9565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e95780601f106101be576101008083540402835291602001916101e9565b820191906000526020600020905b8154815290600101906020018083116101cc57829003601f168201915b505050505090505b90565b60008180516102079291602001906102bb565b5050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102a15780601f10610276576101008083540402835291602001916102a1565b820191906000526020600020905b81548152906001019060200180831161028457829003601f168201915b505050505081565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102fc57805160ff1916838001178555610329565b82800160010185558215610329579182015b8281111561032957825182559160200191906001019061030e565b50610335929150610339565b5090565b6101f191905b80821115610335576000815560010161033f5600a165627a7a72305820352cec017ed93c8351ac6fbc835eda354ea6dbc9e672ae6b60c16f29c49a5cd30029
์ ํ ๋ญ์ง ๋ชจ๋ฅด๊ฒ ์ฃ ? ์ปดํ์ผ๋ ์ฝ๋๋ผ ๊ธฐ๊ณ๋ง ์ดํดํ ์ ์๋ ์ฝ๋์ด๋ ๋ชจ๋ฅด๋๊ฒ ๋น์ฐํฉ๋๋ค~
๊ทธ๋ฌ๋ฉด ์ปดํ์ผ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ธ๋ฝ์ฒด์ธ์ ๋ฐฐํฌํ๋ ์ ์ฐจ์
๋๋ค.
remix๋ฅผ ์ฐ๋ฉด ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ฉด, ๋ฐ์ดํธ ์ฝ๋์ ABI๋ ์๋์ผ๋ก ์ป์ด์ง๋๋ค. geth๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ผ์ผ์ด ์์ฑํด์ผ ํฉ๋๋ค.
geth ์ฝ์์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ถํฐ ABI, ์ฆ ์ค๋งํธ ์ปจํธ๋ํธ์์ ์ฌ์ฉ๋ ์ธํฐํ์ด์ค ๋ถ๋ถ์ ์ป์ด์์ผ ํฉ๋๋ค.
contractAbiDefinition=sourceCompiled['/tmp/geth-compile-solidity602335484:HelloWorld'].info.abiDefinition
[{
constant: true,
inputs: [],
name: "say",
outputs: [{
name: "",
type: "string"
}],
payable: false,
stateMutability: "view",
type: "function"
}, {
constant: false,
inputs: [{
name: "_greeting",
type: "string"
}],
name: "setGreeting",
outputs: [],
payable: false,
stateMutability: "nonpayable",
type: "function"
}, {
constant: true,
inputs: [],
name: "greeting",
outputs: [{
name: "",
type: "string"
}],
payable: false,
stateMutability: "view",
type: "function"
}, {
inputs: [{
name: "_greeting",
type: "string"
}],
payable: false,
stateMutability: "nonpayable",
type: "constructor"
}]
์ด๋ ๊ฒ ์ค๋งํธ ์ปจํธ๋ํธ์ ABI๊ฐ ์ป์ด์ง๋๋ค.
geth ์ฝ์์์ eth.contract ํจ์๋ฅผ ์ด์ฉํ๋ฉด ABI๋ก ๋ถํฐ ์ค๋งํธ ์ปจํธ๋ํธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ๋จ๊ณ๋ ์ผ๋ฐ์ ์ฝ๋ฉ์์ ํด๋์ค๋ฅผ ์ ์ํ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค. ์ค์ ์ค๋งํธ ์ปจํธ๋ํธ์ ์ฃผ์๊ฐ ์์ฑ๋๊ฒ ์๋๋๋ค.
sourceCompiledContract= eth.contract(contractAbiDefinition)
{
abi: [{
constant: true,
inputs: [],
name: "say",
outputs: [{...}],
payable: false,
stateMutability: "view",
type: "function"
}, {
constant: false,
inputs: [{...}],
name: "setGreeting",
outputs: [],
payable: false,
stateMutability: "nonpayable",
type: "function"
}, {
constant: true,
inputs: [],
name: "greeting",
outputs: [{...}],
payable: false,
stateMutability: "view",
type: "function"
}, {
inputs: [{...}],
payable: false,
stateMutability: "nonpayable",
type: "constructor"
}],
eth: {
accounts: ["0x9751574414138b22986eb80ce2713cd2f5508c5c", "0xe37aa5cd578bb1ac568298e5621e11b8a8a113eb", "0xc94593e5164b6f4b5a2f9f0165c1b520858438de", "0x7a1809177f225053ed413743d7321fba8413a7b5"],
blockNumber: 1179,
coinbase: "0x9751574414138b22986eb80ce2713cd2f5508c5c",
compile: {
lll: function(),
serpent: function(),
solidity: function()
},
defaultAccount: undefined,
defaultBlock: "latest",
gasPrice: 20000000000,
hashrate: 131062,
mining: true,
pendingTransactions: [],
syncing: false,
call: function(),
contract: function(abi),
estimateGas: function(),
filter: function(fil, callback),
getAccounts: function(callback),
getBalance: function(),
getBlock: function(),
getBlockNumber: function(callback),
getBlockTransactionCount: function(),
getBlockUncleCount: function(),
getCode: function(),
getCoinbase: function(callback),
getCompilers: function(),
getGasPrice: function(callback),
getHashrate: function(callback),
getMining: function(callback),
getNatSpec: function(),
getPendingTransactions: function(callback),
getRawTransaction: function(),
getRawTransactionFromBlock: function(),
getStorageAt: function(),
getSyncing: function(callback),
getTransaction: function(),
getTransactionCount: function(),
getTransactionFromBlock: function(),
getTransactionReceipt: function(),
getUncle: function(),
getWork: function(),
iban: function(iban),
icapNamereg: function(),
isSyncing: function(callback),
namereg: function(),
resend: function(),
sendIBANTransaction: function(),
sendRawTransaction: function(),
sendTransaction: function(),
sign: function(),
signTransaction: function(),
submitTransaction: function(),
submitWork: function()
},
at: function(address, callback),
getData: function(),
new: function()
}
์ด๋ถ๋ถ์ด ์ค๋งํธ ์ปจํธ๋ํธ์ ๊ฐ๋
์ข
๊ฒฐ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
3.2์์ ์์ฑํ ์ค๋งํธ ์ปจํธ๋ํธ ๊ฐ์ฒด๋ฅผ ์ค์ ๋ก ๋ธ๋ฝ ๋ด์ฉ์ ํฌํจ์์ผ์, ์ฑ๊ตด๋์ด ๋ธ๋ฝ์ฒด์ธ์ ํฌํจ๋๋๋ก ํ๋ ๊ณผ์ ์
๋๋ค. ์ด ๋ ๋น๋ก์, ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ค๋งํธ ์ปจํธ๋ํธ์ ์ ๊ทผํ ์ ์๋ ์ฃผ์๊ฐ ์์ฑ๋ฉ๋๋ค.
3.2์์ ๋ง๋ ์ค๋งํธ ์ปจํธ๋์ค ๊ฐ์ฒด(๊ฐ์ฒด๋ผ๊ณ ํ์ง๋ง ํด๋์ค์ ๊ฐ์ด ์์ง ์ค์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ์ํ)๋ก๋ถํฐ ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ด ๋, ์ค๋งํธ ์ปจํธ๋ํธ ์ต์ด ๋ฐฐํฌ์์๋ง ์์ฑ์์ ์
๋ ฅ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฃ์ด์ค๋๋ค.
> _greeting="Hello, World"
๊ทธ๋ฐ ๋ค์ ๋งค๊ฐ๋ณ์์ ํจ๊ป, ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ํ๋์ ํธ๋์ญ์
์ฒ๋ผ ์์ฑํฉ๋๋ค. ์ด ๋, ํธ๋์ญ์
์ ์ก์ ์, ๋ฐ์ดํธ ์ฝ๋, ์ฌ์ฉ๋ ์์ gas๋์ ๊ฐ์ด ์
๋ ฅํฉ๋๋ค.
> contract= sourceCompiledContract.new( _greeting, {from:eth.accounts[0], data:sourceCompiled['/tmp/geth-compile-solidity602335484:HelloWorld'].code gas:'4700000'})
{
abi: [{
constant: true,
inputs: [],
name: "say",
outputs: [{...}],
payable: false,
stateMutability: "view",
type: "function"
}, {
constant: false,
inputs: [{...}],
name: "setGreeting",
outputs: [],
payable: false,
stateMutability: "nonpayable",
type: "function"
}, {
constant: true,
inputs: [],
name: "greeting",
outputs: [{...}],
payable: false,
stateMutability: "view",
type: "function"
}, {
inputs: [{...}],
payable: false,
stateMutability: "nonpayable",
type: "constructor"
}],
address: undefined,
transactionHash: "0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1"
}
3.3์ ๋ง์ง๋ง ๋ด์ฉ์ ๋ณด๋ฉด ํด๋น ํธ๋์ญ์
์ด ์์ง ์ฑ๊ตด๋์ง ์์ ์ํ๋ผ์ address: undefined,๋ผ๊ณ ํ์๋ฉ๋๋ค. ์ฆ, ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ค๋งํธ ์ปจํธ๋ํธ์ ๊ณ์ ์ฃผ์๊ฐ ์์ง ์์ฑ ์ ์
๋๋ค. ๋ง์ด๋๊ฐ ํธ๋์ญ์
์ด ํฌํจ๋ ๋ธ๋ฝ์ ์ฑ๊ตดํ๊ฒ ๋๋ฉด ๋น๋ก์ ์ค๋งํธ ์ปจํธ๋ํธ ์ฃผ์๊ฐ ์์ฑ๋ฉ๋๋ค. ์๋์ ๊ฐ์ด์.
address: "0x6f9c338bb987f1baf619697784c9457b9afa119c",
transactionHash: "0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1",
allEvents: function(),
greeting: function(),
say: function(),
setGreeting: function()
address: "0x6f9c338bb987f1baf619697784c9457b9afa119c" ์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ค๋งํธ ์ปจํธ๋ํธ ๊ณ์ ์ฃผ์์
๋๋ค.
๊ทธ๋ฌ๋ฉด ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ๋ฐฐํฌํ๋ ํธ๋์ญ์
๋ด์ฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. 3.3์์ ์์ฑํํธ๋์ญ์
์ ํด์ฌ๊ฐ์ ์ด๋ ์ต๋๋ค.
transactionHash: "0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1"
์ด ํธ๋์ญ์
์ ๋ด์ฉ์ geth ์ฝ์์์ ํ์ธํ ์ ์์ต๋๋ค. ์ฃผ์ํ ์ ์ ํธ๋์ญ์
ํด์ฌ์ ์ค๋งํธ ์ปจํธ๋ํธ ๊ณ์ ์ฃผ์๋ ๋ค๋ฅธ ๊ฒ์
๋๋ค.!
> eth.getTransaction("0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1")
{
blockHash: "0x2691dcfbd09febcd6d60537386974ba2147ef2ada4e7693a541000442aa5d91d",
blockNumber: 1230,
from: "0x9751574414138b22986eb80ce2713cd2f5508c5c",
gas: 4700000,
gasPrice: 20000000000,
hash: "0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1",
input: "0x6060604052341561000f57600080fd5b60405161046d38038061046d833981016040528080519091019050600081805161003d929160200190610044565b50506100df565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061008557805160ff19168380011785556100b2565b828001600101855582156100b2579182015b828111156100b2578251825591602001919060010190610097565b506100be9291506100c2565b5090565b6100dc91905b808211156100be57600081556001016100c8565b90565b61037f806100ee6000396000f3006060604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663954ab4b2811461005b578063a4136862146100e5578063ef690cc014610138575b600080fd5b341561006657600080fd5b61006e61014b565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100aa578082015183820152602001610092565b50505050905090810190601f1680156100d75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156100f057600080fd5b61013660046024813581810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506101f495505050505050565b005b341561014357600080fd5b61006e61020b565b6101536102a9565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e95780601f106101be576101008083540402835291602001916101e9565b820191906000526020600020905b8154815290600101906020018083116101cc57829003601f168201915b505050505090505b90565b60008180516102079291602001906102bb565b5050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102a15780601f10610276576101008083540402835291602001916102a1565b820191906000526020600020905b81548152906001019060200180831161028457829003601f168201915b505050505081565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102fc57805160ff1916838001178555610329565b82800160010185558215610329579182015b8281111561032957825182559160200191906001019061030e565b50610335929150610339565b5090565b6101f191905b80821115610335576000815560010161033f5600a165627a7a72305820352cec017ed93c8351ac6fbc835eda354ea6dbc9e672ae6b60c16f29c49a5cd300290000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c48656c6c6f2c20576f726c640000000000000000000000000000000000000000",
nonce: 1,
r: "0x7e7bbc34563f0a6e7d5113344eaea0761d4edf815d41ac752d3cb33b4f65fb43",
s: "0x61a968fcab4935d0f17b67a5274c31ed2a499ccbc5aa605a9080192a940834e9",
to: null,
transactionIndex: 0,
v: "0x1b",
value: 0
}
์ผ๋ฐ์ ์ ์ก๊ธ ๊ฑฐ๋์ ๋ฌ๋ฆฌ ํธ๋์ญ์
์ input:์ ๊ฐ์ด ์์ต๋๋ค. ์ด ๊ฒ์ด ๋ฐ๋ก ์ค๋งํธ ์ปจํธ๋ํธ ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ ๋ฐ์ดํธ ์ฝ๋์
๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฑฐ๋์์๋ ๋ฐ์ดํธ ์ฝ๋๊ฐ ํ์์๊ธฐ ๋๋ฌธ์ input: 0x๋ก ๋ํ๋ฉ๋๋ค. ์ด ์ ์ด ์ค๋งํธ ์ปจํธ๋ํธ์ ์ผ๋ฐ ๊ฑฐ๋์ ๋ค๋ฅธ ์ ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์๊ฐ ์์ต๋๋ค. ์ฆ, ์ก์ ์๋ง ์๊ณ , ์์ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ ๋น์ฐํฉ๋๋ค. ์ค๋งํธ ์ปจํธ๋ํธ๋ ์ด๊ฒ์ ์์ฑํ ์ก์ ์๊ฐ ํน์ ์์ ์ ์ง์ ํ์ง ์๊ณ ์์ ์ด ์์ฑํ๊ณ์ฝ ์ฝ๋๋ฅผ ๋ธ๋ฝ์ฒด์ธ์ ์ฌ๋ฆฐ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๋ฌ๋ฉด, ์ด ์ค๋งํธ ์ปจํธ๋ํธ๊ฐ ํฌํจ๋ ๋ธ๋ฝ(blockNumber: 1230)์ด ์ฑ๊ตด๋ ์ํ์์ ๋ธ๋ฝ ์ ๋ณด๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
> eth.getBlock(1230)
{
difficulty: 234190,
extraData: "0xd783010505846765746887676f312e362e32856c696e7578",
gasLimit: 40355674,
gasUsed: 293248,
hash: "0x2691dcfbd09febcd6d60537386974ba2147ef2ada4e7693a541000442aa5d91d",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x9751574414138b22986eb80ce2713cd2f5508c5c",
mixHash: "0xdd2c7606df86047b0c769a375074f4630a850345a63a8236a8b0f8628a9ba43e",
nonce: "0x1f1450b847e902d0",
number: 1230,
parentHash: "0xf72c4cc5ec6c6ce1ad477396cc1dfcf81a5028844d0b21aa563fb651cf9c62e1",
receiptsRoot: "0xff4331768f55966c79f25c49800b70572d62856ab00960371b411430a022d05e",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 1858,
stateRoot: "0xf39ba07306e185b8fc5a66fd54de9aef311fd00e59f268453cdde7db4d121f29",
timestamp: 1515859762,
totalDifficulty: 218484208,
transactions: ["0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1"],
transactionsRoot: "0x63e1a02b6d3a89fe118f481e5ab23093d52e89d475a9ff83e4dbb37c3ce3c7a2",
uncles: []
}
์์์ ์ปจํธ๋ํธ ๋ฐฐํฌํ ๋, ์ค์ ํ gas๋์ธ 4700000๋ณด๋ค ์ ์ gasUsed: 293248๊ฐ ์๋ชจ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ค๋งํธ ์ปจํธ๋ํธ๊ฐ ๋ธ๋ฝ์ฒด์ธ์ ์ฌ๋ผ๊ฐ์ผ๋ ์ด์ ์ค๋งํธ ์ปจํธ๋ํธ ์ฃผ์๋ฅผ ์ด์ฉํ์ฌ ์ ๋ณด๋ฅผ ์ฝ๊ณ ์ฐ๊ณ ํ ์ ์์ต๋๋ค. geth ์ฝ์์์ ์๋ก์ด ์ปจํธ๋ํธ ๊ฐ์ฒด๋ฅผ ๋ง๋๋๋ฐ ์ด ๋๋ ๊ธฐ์กด์ ์กด์ฌํ๋ ์ปจํธ๋ํธ์ ์ฃผ์๋ฅผ ์ด์ฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์์์ ์์ฑํ ์ค๋งํธ ์ปจํธ๋ํธ์ ๊ณ์ ์ฃผ์์ธ 0x6f9c338bb987f1baf619697784c9457b9afa119c๋ฅผ ์ด์ฉํ์ฌ contract2๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
> contract2= eth.contract(contractAbiDefinition).at("0x6f9c338bb987f1baf619697784c9457b9afa119c")
{
abi: [{
constant: true,
inputs: [],
name: "say",
outputs: [{...}],
payable: false,
stateMutability: "view",
type: "function"
}, {
constant: false,
inputs: [{...}],
name: "setGreeting",
outputs: [],
payable: false,
stateMutability: "nonpayable",
type: "function"
}, {
constant: true,
inputs: [],
name: "greeting",
outputs: [{...}],
payable: false,
stateMutability: "view",
type: "function"
}, {
inputs: [{...}],
payable: false,
stateMutability: "nonpayable",
type: "constructor"
}],
address: "0x6f9c338bb987f1baf619697784c9457b9afa119c",
transactionHash: null,
allEvents: function(),
greeting: function(),
say: function(),
setGreeting: function()
}
๊ทธ๋ผ contract2๋ฅผ ์ด์ฉํ์ฌ ์ค๋งํธ ์ปจํธ๋ํธ์ ๊ณต์ ๋ณ์ ๊ฐ์ ๋ฐ๊ฟ ๋ณด๊ฒ ์ต๋๋ค.
> contract2.setGreeting.sendTransaction( "Hello, Ethereum", {from:eth.accounts[0], gas:1000000})
"0xa6b71f81b5d6d5c71248afb0e89f34aa2e0e52f98e353899bf80166b072fed36"
contract2๋ฅผ ํตํด์ ์ค๋งํธ ์ปจํธ๋ํธ์ ๊ณต์ ๋ณ์ ๊ฐ์ ๋ฐ๊พธ๋ ๊ฒ๋ ํ๋์ ํธ๋์ญ์
์ ์์ฑํฉ๋๋ค. ์ ๋ช
๋ น์ ๊ฒฐ๊ณผ๋ก ํธ๋์ญ์
0xa6b71f81b5d6d5c71248afb0e89f34aa2e0e52f98e353899bf80166b072fed36"์ด ๋ฐ์ํ์์ต๋๋ค. ์ด ํธ๋์ญ์
์ด ํฌํจ๋ ๋ธ๋ฝ์ด ์ฑ๊ตด๋๋ฉด ์ค๋งํธ ์ปจํธ๋ํธ์ ๊ณต์ ๋ณ์ ๊ฐ์ด ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
contract, contract2์์ ๊ณต์ ๋ณ์๋ฅผ ์ ๊ทผํด ๋ณด๋ฉด ๊ฐ์ด ๋ฐ๋ ๊ฐ์ด ๋์ผํ๊ฒ ์ฝํ๊ฒ ๋ฉ๋๋ค. ์ฆ, ๋ณต์์ ์ฌ์ฉ์๊ฐ ๊ฐ๊ฐ ์ค๋งํธ ์ปจํธ๋ํธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํด๋น ์ค๋งํธ ์ปจํธ๋ํธ์ ์ ๊ทผํ์ฌ ๊ฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ฝ์ด ์ฌ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด ๋, ์ค๋งํธ ์ปจํธ๋ํธ์ ์ฐ๋ ๊ฒ๋ ๊ฒ์ ํธ๋์ญ์ ์ ๋ฐ์์ํค์ง๋ง, ๊ฐ์ ์ฝ์ด ์ค๋ ๊ฒ์ ํธ๋์ญ์ ์ ๋ฐ์์ํค์ง ์์ต๋๋ค. ์๋์ ๊ฐ์ด ๊ณต์ ๋ณ์ ๊ฐ์ ์ฝ๊ธฐ๋ง ํ๋ ๊ฒฝ์ฐ๋ ํธ๋์ญ์ ์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ์ฝ๋ ์์ ์ ๋ฑํ ๊ฑฐ๋๋ผ๊ณ ๋ณด๊ธฐ ์ด๋ ต๊ฒ ์ฃ .
> contract.say.call()
"Hello, Ethereum"
> contract.setGreeting.sendTransaction( "Hello, Bitcoin", {from:eth.accounts[0], gas:1000000})
"0xe3878aa2689efc199f1159eb8c839882206405c5fb9d3c5eebfbe719a6b49d44"
๋ค์ ๊ทธ๋ฆผ์ผ๋ก ๋์์์, ์ค๋งํธ ์ปจํธ๋ํธ๊ฐ ๋ธ๋ฝ์ฒด์ธ์ ์ฌ๋ผ๊ฐ๋ฉด ๋ธ๋ฝ์ฒด์ธ ์์ ๋ชจ๋ ๋ ธ๋๋ ํด๋น ์ค๋งํธ ์ปจํธ๋ํธ์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์, ๊ฐ ๋ ธ๋, ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ ํด๋น ์ค๋งํธ ์ปจํธ๋ํธ๋ฅผ ์์ ์ EVM์์ ์คํ์ํฌ ์๊ฐ ์์ต๋๋ค. ํ ๋ ธ๋์์ ์ค๋งํธ ์ปจํธ๋ํธ์ ๋ด์ฉ์ ๋ณ๊ฒฝ์ํค๋ ๋ช ๋ น์ ํธ๋์ญ์ ์ ๋ฐ์์์ผ ๋ด์ฉ ๋ณ๊ฒฝ์ด ์ด๋ฃจ์ด์ ธ, ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊ฐ ์ปจํธ๋ํธ์ ์ ๊ทผํ๋ฉด ๋ฐ๋ ๋ด์ฉ์ ์ป๊ฒ ๋ฉ๋๋ค.
์ค๋งํธ ์ปจํธ๋ํธ์ ๋์ ๋ฐฉ์์ด ์ข ๊ฒฐ๋์๋์? ์ต๊ทผ์ ์ด๋๋ฆฌ์ ๊ฐ๋ฐ์๋ค์ด ๋์ค๋ค ๋ณด๋ ํ์คํ ์ดํดํ๋๋ฐ ์ข๋ค์. ์ ๋ชจ๋ ๋ค๊ฐ์ด ์ด๋๋ฆฌ์ ๊ฐ๋ฐ ๊ฐ์ฆ์~
์ค๋์ ์ค์ต: ์ค๋งํธํฐ์์๋ ๋ธ๋ฝ์ฒด์ธ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ ์ฅํ๊ธด ์ด๋ ต์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ผ์ข
์ ์๋ฒ์ธ ์ด๋๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ฅผ ํตํด์ ๋ธ๋ฝ์ฒด์ธ ์๋น์ค๋ฅผ ์ด์ฉํด์ผ ํ๋๋ฐ, ์ด๊ฒ์ ํ์ค์ํ์ ๋ฐํ๋ ๊ฒ์ผ๊น์?