重眀殿
스마트 컨트랙트 geth 에 집어넣기 본문
안녕 친구들
존나게 블록체인 업계에서 일하고 있는 앙마당이라고 해
참고로 이 글은 남들을 위한 글이 아니고 날 위한 거야 내가 워낙 빡 대가리라 잘 까먹거든
오늘은 스마트 컨트렉트를 geth 에 집어넣는법을 배워보고자 해
머 인터넷에 존나 abi 파일이 어쩌구 저쩌구 ㅅㅂ
deploy smart contract 라고 ㅈㄹㅈㄹ 하는 곳들이 많은데
이런건 공부를 해야 알아들을수 있어 어차피 우린 공부를 하기 싫고 그냥 따라서 다 됬으면 좋은 한국인 이잖아
무슨 조선인이 창의력이야 있는거 보고 빼기기도 바쁜데 안그래 ?
자 그럼 이제 한단계씩 스텝을 밟으며 따라 해보자
* 참고 *
https://medium.com/mercuryprotocol/dev-highlights-of-this-week-cb33e58c745f
(공부 열심히한 엘리트들은 이거봐 내꺼보지말고 여기 다 나와)
참고로 무조건 꼬오오오오오오오오옥 순서를 지켜
1. 리믹스 앱 들어가기
자 우리가 필요한건 솔리디티 프로그램 짜는 웹 remix가 필요해 머 mist 이야기 하는 새끼들은 나도 몰라 그딴거 안써봤어
머 방법이 저마다 다르겠지 여튼 웹주소로 들어가 https://remix.ethereum.org
그럼 요런 창이 떠
안에 있는 영어 비교하면서 아 다르네 머 잘못했나 하는 형들 있을거야 걱정마 아무 상관없어
어차피 형들 영어 못읽잖아 까막눈인데 먼상관이야 그냥 지렁이가 기어간다고 생각하면 되지
어쨋든 저기 저 창이 뜨면서 비슷하게만 나오면 성공 했군 이라고 생각하면되
2. 리믹스 파일 만들기
자 이제 두번째 소스를 넣어야 되잖아 저 리믹스는 우리 프로그래머가 흔하게 사용하는 IDE인 인텔리제이나 이클립스 라고 생각을해
아 인텔리제이나 이클립스를 모른다고? 괜찮아 그럴수 있어 IDE가 먼지 몰라도되 더 쉽게 말해서 니가 토큰이란걸 만들려고 할때 쓰는
하나의 도화지 라고 생각하면되
존나 성의 없지만 그냥봐 니들이 돈주는거 아니잖아 그리고 내가 볼려고 써논거야 불만많으면 나한테 비밀댓글 달고 연락해
어쨋든 화살표 플러스 버튼 누르고 저 노란색 친 텍스트 칸에 NoSaram.sol 이라고 적고 오케이를 눌러
그러면
이렇게 빈 도화지가 뜰거야 가운데 있는 흰색만 비면되 옆에 영어가 머라고 써있든 제발 당황하지 말자 친구들
형들이 잘못한게 아니고 원래 이게 ㅄ같은 거니까
3. 솔리디티 언어 작성
자 이제 저 빈칸에 솔리디티 소스 코드를 넣을 거야 잘들어야되 여기서부턴
소스코드는 내가 줄테니까 아래에 있는 소스코드를 넣도록해
----------------------------------------------------------------------------------------------------------------------------------------
pragma solidity ^0.4.8;
contract OreOreCoin {
//(1) 상태 변수 선언
string public name;
string public symbol;
uint8 public decimal;
uint256 public totalSupply;
mapping(address => uint256) public balanceOf; // 각 주소의 잔고
//(2) 이벤트 알림
event Transfer (address indexed from , address indexed to , uint256 value);
//(3) 생성자
function OreOreCoin (uint256 _supply , string _name , string _symbol, uint8 _decimals){
balanceOf[msg.sender] = _supply;
name = _name;
symbol = _symbol;
decimal = _decimals;
totalSupply = _supply;
}
//(4) 송금
function transfer(address _to , uint256 _value){
//(5) 부정 송금 확인
if(balanceOf[msg.sender] < _value) revert();
if(balanceOf[_to] + _value < balanceOf[_to]) revert();
//(6) 송금하는 주소와 송금 받는 주소의 잔고 갱신
balanceOf[msg.sender] = balanceOf[msg.sender] - _value;
balanceOf[_to] = balanceOf[_to] + _value;
//(7) 이벤트 알림
Transfer(msg.sender, _to , _value);
}
}
-------------------------------------------------------------------------------------------------------------------------------------------
돌아댕기는 예제 소스 그대로 니까 저작권 이야기 하면서 드립 치지말자 이딴 소스 가지라고 해도 안가지는 소스니까
자 이소스를 흰 도화지에 붙여넣도록해
자 됬지 그럼 이제 이걸 컴파일을 시킬거야 여기부터 잘들어야되
실수하면 x되 흰도화지 오른쪽 칸을 보면 영어로 존나게 써있고 버튼들이 있는 칸이 보일거야
먼저 소스 코드 중에
pragma solidity ^0.4.8;
이거 보이지 다른 부분은 해석을 안해도 되지만 이부분은 반드시 보고 가야되 알아 읽기도 귀찮은거 근데 이부분은 진짜 중요 한거야 저 말은 솔리 디티 컴파일러 0.4.8 이상에서 돌아간다는 이야기야 즉 0.4.8 이하인 0.4.7 에서는 동작을 안해 근데 진짜 좃같은건 솔리디티가 개 ㅄ급 언어란거야 이상에서도 다 돌아가지 않아
옆에 칸중 셀렉트 컴파일러 버전을 누르면 여러가지 버전이 떠 즉 솔리디티 언어를 해석하는 컴파일언어가 진짜 너무 나도 많을 꺼야 근데 이상이라고 해놓고 내가 확인한바로는 0.4.27 이상에서는 돌아가지 않아 즉 내가 봤을떄 15 버전 이상 차이가 나면 돌아가는거 같지가 않는거 같아 근데 왜 저렇게 컴파일러가 많냐고 ?
이더리움은 퍼블릭 블록체인이야 그래서 컴파일러 역시 사람들이 지 들 입맛에 수정 할 수 있어 물론 우리같은 컴알못들은 못 건들이지만 대국에 계신 컴잘알 형님들은 오늘도 열심히 지들이 생각하는 이상적인 솔리디티 컴파일러를 배포하시고 계신거야 그래서 저 ㅈㄹ 이 나는거고 왜냐면 블록체인 세상엔 아직 표준이라고 불릴만한게 너무 나도 미약하거든 어쨋든 저기서 적당히 빨간색 원으로 처진 버전을 선택해 꼭 저거 아니여도되 대충 4.21 맟춰서 하면될거야
자 이제 컴파일을 시도 해보자
그러면 리믹스가 알아서 소스를 컴파일 할거야 말했듯이 버전이 제대로 맞지 않으면 아쉽게도 정상 작동 하지 않을 거야 정상 작동 여부를 어떻게 알수 있냐면 간단해 옆의 컨파일러 칸에는 3가지 색깔의 알람 창이 떠
보면 빨간색 원친 부분에서 빨간색 카드만 안뜨면 이건 정상적으로 동작하는거야 지금 내가 이건 컴파일러 버전을 일부러 0.4.26 으로 바꾸어서 안되게끔 해놓은 거야 자 반드시 명심해 빨간색만 안뜨면 되 파란색이나 주황색은 노상관이야
4. ABI 데이터 추출
어쨋든 제대로 빨간카드가 없이 뜬다면 이제 이코드는 정상적으로 돌아 가는 거야 자 그럼 이제 이 소스를 드디어 우리가 그렇게 학수 고대한 GETH 에 집어 넣어 보자 먼저 제대로 컴파일된 소스에 ABI 파일을 봐야되
저 기에서 Details를 클릭하면
이런 화면이 뜨게되 우리는 이중에 스크롤을 아래로 내려다 보면
WEB3DEPLOY 라는 칸이 있어 저거 그대로 컨트롤 v에서 복사한다음 메모장으로 가져와 참고로 복사하기 버튼은 WEB3DEPLOY 글씨 옆에 바로 책처럼 생긴 아이콘 눌러도 복사 되니까 그걸로 가져오면 되
----------------------------------------------------------------------------------------------------------------
var _supply = /* var of type uint256 here */ ;
var _name = /* var of type string here */ ;
var _symbol = /* var of type string here */ ;
var _decimals = /* var of type uint8 here */ ;
var oreorecoinContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimal","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_supply","type":"uint256"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]);
var oreorecoin = oreorecoinContract.new(
_supply,
_name,
_symbol,
_decimals,
{
from: web3.eth.accounts[0],
data: '0x6060604052341561000f57600080fd5b6040516107ff3803806107ff8339810160405280805190602001909190805182019190602001805182019190602001805190602001909190505083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600090805190602001906100a39291906100e6565b5081600190805190602001906100ba9291906100e6565b5080600260006101000a81548160ff021916908360ff160217905550836003819055505050505061018b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061012757805160ff1916838001178555610155565b82800160010185558215610155579182015b82811115610154578251825591602001919060010190610139565b5b5090506101629190610166565b5090565b61018891905b8082111561018457600081600090555060010161016c565b5090565b90565b6106658061019a6000396000f300606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461007d57806318160ddd1461010b57806370a082311461013457806376809ce31461018157806395d89b41146101b0578063a9059cbb1461023e575b600080fd5b341561008857600080fd5b610090610280565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100d05780820151818401526020810190506100b5565b50505050905090810190601f1680156100fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561011657600080fd5b61011e61031e565b6040518082815260200191505060405180910390f35b341561013f57600080fd5b61016b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610324565b6040518082815260200191505060405180910390f35b341561018c57600080fd5b61019461033c565b604051808260ff1660ff16815260200191505060405180910390f35b34156101bb57600080fd5b6101c361034f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102035780820151818401526020810190506101e8565b50505050905090810190601f1680156102305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561024957600080fd5b61027e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506103ed565b005b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103165780601f106102eb57610100808354040283529160200191610316565b820191906000526020600020905b8154815290600101906020018083116102f957829003601f168201915b505050505081565b60035481565b60046020528060005260406000206000915090505481565b600260009054906101000a900460ff1681565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103e55780601f106103ba576101008083540402835291602001916103e5565b820191906000526020600020905b8154815290600101906020018083116103c857829003601f168201915b505050505081565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561043957600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540110156104c657600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505600a165627a7a72305820dbcfed07db190a89debeb88257dbfc9b70fd75832bfa66ed26a10305c42dc9640029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
----------------------------------------------------------------------------------------------------------------
내가 그냥 여기서 편하게 복사 할수 있게 해줄게 저위의 소스에서 니들이 꼭 변경해야 할 부분이 있어
----------------------------------------------------------------------------------------------------------------
var _supply = /* var of type uint256 here */ ;
var _name = /* var of type string here */ ;
var _symbol = /* var of type string here */ ;
var _decimals = /* var of type uint8 here */ ;
----------------------------------------------------------------------------------------------------------------
이부분을 반드시 변경해야되 영어를 읽어서 해석하면 저거에 알맞는 데이터 양식을 넣어야해
그럼 저부분을 변경해서 내가 넣고 싶은 갚을 넣으면 아래 처럼 되는거야
----------------------------------------------------------------------------------------------------------------
var _supply = 10000;
var _name = "NoSaramCoin";
var _symbol = "nosaram";
var _decimals = 18;
----------------------------------------------------------------------------------------------------------------
다시 월래 소스를 밑에 붙여넣으면 이렇게 완성되겠지
----------------------------------------------------------------------------------------------------------------
var _supply = 10000;
var _name = "NoSaramCoin";
var _symbol = "nosaram";
var _decimals = 18;
var oreorecoinContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimal","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_supply","type":"uint256"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]);
var oreorecoin = oreorecoinContract.new(
_supply,
_name,
_symbol,
_decimals,
{
from: web3.eth.accounts[0],
data: '0x6060604052341561000f57600080fd5b6040516107ff3803806107ff8339810160405280805190602001909190805182019190602001805182019190602001805190602001909190505083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600090805190602001906100a39291906100e6565b5081600190805190602001906100ba9291906100e6565b5080600260006101000a81548160ff021916908360ff160217905550836003819055505050505061018b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061012757805160ff1916838001178555610155565b82800160010185558215610155579182015b82811115610154578251825591602001919060010190610139565b5b5090506101629190610166565b5090565b61018891905b8082111561018457600081600090555060010161016c565b5090565b90565b6106658061019a6000396000f300606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461007d57806318160ddd1461010b57806370a082311461013457806376809ce31461018157806395d89b41146101b0578063a9059cbb1461023e575b600080fd5b341561008857600080fd5b610090610280565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100d05780820151818401526020810190506100b5565b50505050905090810190601f1680156100fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561011657600080fd5b61011e61031e565b6040518082815260200191505060405180910390f35b341561013f57600080fd5b61016b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610324565b6040518082815260200191505060405180910390f35b341561018c57600080fd5b61019461033c565b604051808260ff1660ff16815260200191505060405180910390f35b34156101bb57600080fd5b6101c361034f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102035780820151818401526020810190506101e8565b50505050905090810190601f1680156102305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561024957600080fd5b61027e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506103ed565b005b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103165780601f106102eb57610100808354040283529160200191610316565b820191906000526020600020905b8154815290600101906020018083116102f957829003601f168201915b505050505081565b60035481565b60046020528060005260406000206000915090505481565b600260009054906101000a900460ff1681565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103e55780601f106103ba576101008083540402835291602001916103e5565b820191906000526020600020905b8154815290600101906020018083116103c857829003601f168201915b505050505081565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561043957600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540110156104c657600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505600a165627a7a72305820d9c72c8ccab96b50dced87b1556b52f03db7be03e3bce8b72800e447c66d625e0029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
})
----------------------------------------------------------------------------------------------------------------
5. geth에 집어넣기
자 이제 대망에 geth 에다가 이소스를 넣어도록 하자
geth를 키자구 형들 자 geth를 까는법이나 키는 법을 모르겠다.
내가 조만간 geth를 세팅하는법 및 private chain을 구성하는 법등을 친절하게 포스트 해줄게 그때까지 참아봐
먼저 geth를 키자구 형들
geth를 사용하기 전에 꼭 해야 될 반드시 필수 과정이 있지 형들도 잘아는 어카운트 락인 제한을 푸는거야
personal.unlockAccount(eth.accounts[0], "형들이 정한 비밀번호를 넣어" , 300000)
그냥 이 명령어를 외워 그리고 geth를 실행 시키자마자 그냥 돌려 이건 아무생각 없어도되 책에선 부슨 보안이 어쩌구 저쩌구 하면서 조심해야 되는 명령어 라는데 이거되면 이더가 날아갈 수도 있는건 맞어 그런데 형들 어차피 이더같은 씹스캠 안살거잖아 주소에 달랑 0.1이더 있으면 다행인 우리들이 무슨 보안이야 해커가 봐도 그지 새끼들 하고 지나가니까 걱정말고 풀어 설마 씹스캠인 이더 풀매수한 흑우 형들 없제?
자이제 아까 만들었던 소스를 그대로 복사해서 붙여넣어
그럼 이런식으로 된다음에
INFO [12-03|16:39:54.385] Submitted contract creation fullhash=0x4248afcc51d0808814d298f41e391496dde166d549be560d4229b0403c520d20 contract=0x4DBe719d07Ea6fA3564E717f236a8D9c2D302A7D
이런게 뜰거야 그러면 된거임 그다음 블록체인 이잖아 채굴을 해야 이런것들이 반영이되 블록체인 세상에서 새로고침 반영은 항상 채굴 이라는걸 명심해야되 언제나 언제나 그냥 무의식적으로라도 어떤 명령어를 날리더라도 무조건 반영 할려면 채굴을 해서 블록에 넣고 인정을 받아야되 명령어는
miner.start(1) 이야
자 보면 채굴을 통하여 컨트랙트 주소가 생성됬어 빨간색 원안의 Contract mined! 라고 뜨면 된거야 좋아 miner.start(1)야
아 참고로 Contract mined! 뜬다음 바로 miner.stop() 으로 꺼줘야해 안그럼 계속 블록 생성됬다고 내려가 버려
자 그러면 이제 우리는 컨트랙트도 생성했고 이제 토큰 10000개를 생성 했어 그럼 이제 10000개가 정상적으로 들어있는지 확인해야지
6. 토큰 생성 10000 개 확인 하기
자 그러면 이제 우리 토큰을 생성 했으니 제대로 잘 박혀 있는지 확인을 해봐야지
----------------------------------------------------------------------------------------------------------------
명령어 :
eth.call({to: "0x4dbe719d07ea6fa3564e717f236a8d9c2d302a7d" , data : "0x70a08231000000000000000000000000cc741c61a3df713f95b6436206be50ff0f909fe9" })
----------------------------------------------------------------------------------------------------------------
결과값 :
"0x0000000000000000000000000000000000000000000000000000000000002710"
----------------------------------------------------------------------------------------------------------------
16진수 계산기
https://ko.calcuworld.com/%EC%88%98%ED%95%99/16%EC%A7%84%EB%B2%95-%EA%B3%84%EC%82%B0%EA%B8%B0/
----------------------------------------------------------------------------------------------------------------
보면 결과값이 0x0000000000000000000000000000000000000000000000000000000000002710 이렇게 나오는데 이게 이더리움 세상에서는 10000 개야 왜냐면 저 앞에 0x 붙은거 보이지 저에 16진수를 가르키거든
자이제 저 명령어를 해석해 보도록 하자 왜냐하면 컨트렉트 주소값이 달라지면 명령어도 자연스럽게 달라지거든 형들도 알다시피 사실 우리가 1+1이 2라는걸 알아도 1+2 는 모르는 아이큐 들이잖아
그러면 저 명령어를 잘 알기 위해서 우리는 해석할 필요가 있어
----------------------------------------------------------------------------------------------------------------
명령어 :
eth.call({to: "0x4dbe719d07ea6fa3564e717f236a8d9c2d302a7d" , data : "0x70a08231000000000000000000000000cc741c61a3df713f95b6436206be50ff0f909fe9" })
----------------------------------------------------------------------------------------------------------------
이걸 잘보면 명령어 이름인 eth.call 이 있고 그안에 "to" 와 "data" 가 존재하지
이명령어를 해석하면 geth 상에 등록된 스마트 컨트렉트를 불러다 주는 거고 to는 이값들을 부를 스마트컨트렉트 주소를 가르키는 것이고 data는 스마트 컨트렉트안에서 어떤 명령어를 실행시킬 것인지를 알려주는 것이지
쉽게 설명해서
to : 스마트 컨트렉트 주소 = 컴퓨터
data : 스마트 컨트렉트 메소드 콜 = 컴퓨터에서 게임 실행
그러면 당연히 to 에는 아까 생성했던 스마트 컨트렉트 주소가 들어가야 겠지 ? 그래서 저 위에 있는 contract=0x4DBe719d07Ea6fA3564E717f236a8D9c2D302A7D 이 주소가 to 값에 들어간거야 아 그리고 이더리움은 아까도 말했듯이 모든 사고방식을 16진수로 하기 때문에 제일 앞에 0x 가 붙는거야 그럼 실제 주소는 4DBe719d07Ea6fA3564E717f236a8D9c2D302A7D 이 값인거지 대소문자 구분같은거 안하니까 걱정말고 사용하고 자 이제 to 값을 알았어 그럼 이제 data 값을 알아볼까 ?
data 안에 들어가는 값은 정말 지저분 하며 욕이나와
왜 그렇게 됬는지 알면 알수록 짜증만 나지 일단 데이터에 들어간 값부터 확인을 해보자
----------------------------------------------------------------------------------------------------------------
0x70a08231000000000000000000000000cc741c61a3df713f95b6436206be50ff0f909fe9
----------------------------------------------------------------------------------------------------------------
생긴거 부터가 숫자랑 영어 덩어리야 이걸보고 아 이게 그런뜻이구나를 알 수 있으면 블록체인 하지말고 빨리 대통령해줘
그래도 우린 해석을 해야 하잖아 ?
이제 해석을 해볼게 0x70a08231000000000000000000000000cc741c61a3df713f95b6436206be50ff0f909fe9 일단 값 뺀앞에 0x는 빼주자고 저건 어차피 통상적으로 넣는 16 진수라는 뜻이니까 그럼 우리에게 떨어지는건
70a08231000000000000000000000000cc741c61a3df713f95b6436206be50ff0f909fe9 이 값이지
관찰력이 좋은 사람은 이 값을 보고 2부분으로 나눌 수 있어
70a08231 | 000000000000000000000000 | cc741c61a3df713f95b6436206be50ff0f909fe9 이렇게 말이지 빨리 답을 말할게
앞에 70a08231 은 balanceOf(address) 앞에 를 가르키고 뒤에 cc741c61a3df713f95b6436206be50ff0f909fe9 현재 토큰이 들어있는 주소를 가르키지 즉 간단히 말해 balanceOf(address) 를 바이너리 숫자로 만들어 놓은게 바로 data야 그럼 우리는 여기서 궁금한게 000000000000000000000000 의 정체인 거지 도데체 이건멀까? 나도 잘은 모르겠지만 (그냥 추측이야 맞을 수도있고 아닌수도 있어 어디까지나 뇌피셜이야) 내가 볼때 그냥 정해져있는 주소값 표현 방식이 있는데 예를들어 uint256 이면 256개 바이트를 채워야 되는데 어드레스 주소가 그걸 다 안채워 주니까 앞을 0값으로 padding 해 놓은것 같아 사실 진짜 나도 몰라 저게 그냥 나는 감으로 배워가지고 정확히는 모르겠어 나중에 나한테 누군가 댓글로 달아줬으면 정말 좋겠어
자 그럼 여기까지 와서 70a08231 이건 밸런스 함수라는건 어떻게 확인했냐고? 그건 다시 remix 로 돌아가서 ABI Detail 을 한번 보도록 하자
이부분에 짜잔 다 적혀있어 사실 저거의 의미는 ERC20 이란 표준을 같다가 전부 바이너리 해석을 했을때 저 값이 나온데 근데 우리는 그걸 d일일히 전부 공부해가며 할 수 없잖아 그래서 remix 를 사용하여 도움을 받는거지
자 그럼 이제 이해가 됬지?
정리하면 data 에 들어가는 값은 솔리디티의 메소드 값이다.
0x | 70a08231 | 000000000000000000000000cc741c61a3df713f95b6436206be50ff0f909fe9
0x | 16진수
70a08231 | balanceOf( 000000000000000000000000cc741c61a3df713f95b6436206be50ff0f909fe9 | address )
자 이제 알겠지?
7. 보너스 토큰 전송
eth.sendTransaction({from:"0xcc741c61a3df713f95b6436206be50ff0f909fe9", to:"0x4dbe719d07ea6fa3564e717f236a8d9c2d302a7d", data : "0xa9059cbb000000000000000000000000d0b9fd4dfe5619d374902d4058a3e34f8d77b5c200000000000000000000000000000000000000000000000000000000000007d0"})
데이터가 존나 더 길어 졌을 거야 그래도 이렇게 하면 토큰 전송할수 있어 저 데이터는 이제 스스로 생각해보자 위에걸 토대로
대가리 깨지면서 공부는 하즈아 !
'大圖書館 > 実験室' 카테고리의 다른 글
Geth script 사용 방법 (1) | 2018.10.19 |
---|---|
와이어 샤크 사용법 (0) | 2018.04.17 |
자동 전등 기구를 제작해보자 (0) | 2017.03.17 |