Smart Contract
란 계약을 코드로 작성하고 일정 조건이 충족되었을때만 해당 계약(코드)이 실행되도록 하는 script
입니다. Solidity Code
로 Smart Contract
작성하면 컴파일러를 통해서 Solidity Code
를 컴파일링을 하여 byte
코드로 변환후 이 byte
코드를 가지고 Transaction
을 발생시켜 블록체인 네트워크에 배포할 것 입니다.솔리디티 언어의 확장자는 .sol
입니다.
vscode
에서 .sol
확장자를 지원하지 않을경우 확장프로그램에서 solidity
를 설치합니다.
HelloWorld.sol
파일을 만들고 아래와 같이 솔리디티 코드를 작성해봅니다./* HelloWorld.sol */
// SPDX-License-Identifier : MIT //
pragma solidity ^0.8.15; // (1) 버전 프라그마
contract HelloWorld { // (2) 계약 선언
string text; // (3) 상태 변수 선언
constructor(){ // (4) 생성자
text = "Hello World";
}
// (5) 메서드 선언
function getText() public view returns(string memory) { // public , private를 안넣으면 에러 뜸
return text;
}
function setText(string memory value) public {
text = value;
}
}
solc
라이브러리
- 솔리디티 코드로 작성한
.sol
파일을EVM
에서 읽을수 없기때문에 컴퓨터가 읽을 수 있도록Byte
코드로 변환하기 위해 사용합니다
ABI
를 ( Application Binary Interface
) 만들기 위해 사용합니다. ABI
이란 SmartContract
의 함수와 매개변수들을 JSON
형식으로 나타낸 리스트입니다.
npm install solc
(Solidity Compiler
설치 )
npx solc --bin --abi [디렉토리/파일명]
Contract_HelloWorld_sol_HelloWorld.bin
및 Contract_HelloWorld_sol_HelloWorld.abi
파일이 생성되었는지 확인합니다.Contract_HelloWorld_sol_HelloWorld.bin
파일에는 실제 블록체인 네트워크에 배포될 코드인 ByteCode
가 있습니다.Contract_HelloWorld_sol_HelloWorld.abi
파일에는 SmartContract
의 함수와 매개변수들이 JSON
형식으로 담겨있습니다.
personal.sendTransaction({from:coinbase, to:'0x..., value:10000000},'1234')
- 그동안
Transaction
을 발생시키려면 위처럼personal.sendTransaction()
으로 두번째 인자값에 해당 지갑의password
를 입력해야 했습니다.- 위처럼 패스워드를 입력하는 이유는 잠겨있는 지갑을
unlock
하기 위해서입니다.
- 전에 생성한 지갑을 살펴보면
UTC-[]-account-[지갑 주소]
이런식으로 되어있는 것을 확인할 수 있는데 이것은 양방향 암호화이기 때문에 지갑 생성할때 입력한password
를 가지고 개인키를 구할 수 있습니다.
node
디렉토리에password
파일 생성후 사용하는 지갑의password
를 입력합니다.
geth
를 실행할 때 사용하려는 지갑의unlock
을 풀고 실행하기위해geth
실행 명령어 뒤에--allow-insecure-unlock --unlock "0,1" --password "./node/password"
를 추가합니다.--unlock
의 값들은eth.getAccounts()
를 기준으로 배열안에index
값을 입력하면 됩니다.- 지금은
eth.getAccounts()
를 기준으로 0번째와 1번째index
에 위치한 지갑을unlock
할것이고password
는 1234로 두 지갑 모두 동일하기 때문에 node 디렉토리에 생성해둔password
파일에 입력한 지갑의password
값을 가지고 지갑을unlock
해 줄것입니다.
geth --datadir node --ws --ws.addr "0.0.0.0" --ws.port 9000 --http.corsdomain "\*" --ws.api "admin,eth,debug,miner,net,txpool,personal,web3" --syncmode full --networkid 1213 --port 30300 --allow-insecure-unlock --unlock "0,1" --password "./node/password"
geth attach "ws://127.0.0.1:9000"
bin
파일의 내용을 bytecode
라는 변수로 저장할것 입니다.abi
파일의 내용을 abi
라는 변수로 저장할 것입니다.from , data(Byte Code)
를 인자값으로 transaction
을 발생 시킬것입니다.txObject = {from:eth.coinbase,data:bytecode}
eth.sendTransaction(txObject)
TransactionHash
값은 가지고 있다가Transaction
을 검색하여Contract Adress
값을 가져올것 입니다.
txpool
로 pendingTransaction
을 확인합니다miner.start(4)
실행후 mining
완료되면 miner.stop()
Transaction
내용 조회해보기
eth.getTransaction('0xa9d26bfb60377264559e2f69cb7479f465704ef5904ae9536a8fd4e421207dc8')
Input
에 우리가 작성한 코드의ByteCode
가 들어있고,To = null
,Value = 0
인것을 확인할 수 있습니다.
eth.getTransactionReceipt("0xa9d26bfb60377264559e2f69cb7479f465704ef5904ae9536a8fd4e421207dc8")
CA="0xcf80f18322bd9a12e17edf424d5a3e48a8b5e84b"
전에 ETH
를 보낼때 발생된 Transaction
과는 달리 Contract Adress
가 추가된것을 확인할 수 있습니다.
이러한 ContractAdress
를 CA
라고 부르는데 CA
계정은 SmartContract
가 생겼을때 생성되는 계정입니다.
다시 말해 CA
는 Contract
의 고유한 키값이라고 생각하면 됩니다.
SmartContract
는 한번 배포하면 수정이 불가능합니다.
instance
생성하기
contract = eth.contract(abi)
eth.contract
에abi
를 추가한 객체를return
합니다.
instance = contract.at("0xcf80f18322bd9a12e17edf424d5a3e48a8b5e84b")
contract
를 가지고 새로운instance
를 생성합니다.
Smart Contract
실행하기
instance.getText.call()
로 생성한instance
안에getText
메서드를 실행하면Hello World!
가 찍힙니다.
call()
은 SmartContract
내용을 가져오는 행위 ( 비용 X )
instance.setText('Hello Contract!',{from:eth.coinbase})
- 상태변수
Hello World!
->Hello Contract!
바꾸려면mining
이 되어야Transaction
이EVM
을 거치면서 값이 바뀌게 됩니다.send()
는SmartContract
내용을 바꾸는 행위- 내용을 바꾸려면
EVM
을 거쳐야 하기 때문에 무조건 비용이 발생합니다.- 바꾸려는 내용이 많을경우 가스비가 더 많이 나옵니다.
npx solc --bin --abi ./Contract/HelloWorld.sol
api = [{}~~~] bytecode = "0x~"
txObject = {from:eth.coinbase,data:bytecode}
contract = eth.contract(abi)
instance = contract.new(txObject)
miner.start(4) && miner.stop
instance.getText.call()
instance.setText("Hello suhwan",{from:eth.coinbase})
txpool 확인후 miner.start(4) && miner.stop
instance.getText.call()
리믹스(
Remix
)는 브라우저에서 솔리디티 프로그래밍 언어로 스마트 계약 개발과 구축을 지원하는 통합개발환경(IDE
)입니다.
위처럼 복잡한 프로세스를 자동으로 처리해주며 브라우저와 이더리움 블록체인에 연결해 스마트계약 배포와 테스트를 할 수 있습니다.