블록체인 Block-Chain - 이더리움 Smart Contract 배포 및 실행하기 ( Geth console )

dev_swan·2022년 7월 11일
0

블록체인

목록 보기
19/36
post-thumbnail

스마트 컨트랙트 ( Smart Contract )

  • Smart Contract계약을 코드로 작성하고 일정 조건이 충족되었을때만 해당 계약(코드)이 실행되도록 하는 script입니다.
  • 스마트 컨트랙트는 스마트 컨트랙트 언어 중 가장 유명한 솔리디티라는 언어를 기반으로 만듭니다.
  • Solidity CodeSmart 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;
    }
}

솔리디티 코드 배포 및 실행

1. Solidity Code 컴파일링 ( solc )

  • solc 라이브러리
  • 솔리디티 코드로 작성한 .sol 파일을 EVM에서 읽을수 없기때문에 컴퓨터가 읽을 수 있도록 Byte코드로 변환하기 위해 사용합니다
  • ABI를 ( Application Binary Interface ) 만들기 위해 사용합니다.
  • ABI이란 SmartContract의 함수와 매개변수들을 JSON 형식으로 나타낸 리스트입니다.
    또한 컨트랙트내의 함수를 호출하거나 컨트랙트로부터 데이터를 얻는데 사용할 인터페이스 부분입니다.
  • npm install solc (Solidity Compiler 설치 )
  • npx solc --bin --abi [디렉토리/파일명]
  • Contract_HelloWorld_sol_HelloWorld.binContract_HelloWorld_sol_HelloWorld.abi 파일이 생성되었는지 확인합니다.
  • Contract_HelloWorld_sol_HelloWorld.bin 파일에는 실제 블록체인 네트워크에 배포될 코드인 ByteCode가 있습니다.
  • Contract_HelloWorld_sol_HelloWorld.abi 파일에는 SmartContract의 함수와 매개변수들이 JSON 형식으로 담겨있습니다.

2. 지갑 unlock하기

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해 줄것입니다.

3. Geth 실행 및 attach

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"

4. SmartContract 배포하기 ( Transaction 발생 )

  • bin 파일의 내용을 bytecode라는 변수로 저장할것 입니다.

  • abi 파일의 내용을 abi라는 변수로 저장할 것입니다.

  • from , data(Byte Code)를 인자값으로 transaction을 발생 시킬것입니다.

txObject = {from:eth.coinbase,data:bytecode}

eth.sendTransaction(txObject)

TransactionHash 값은 가지고 있다가 Transaction을 검색하여 Contract Adress값을 가져올것 입니다.

  • txpoolpendingTransaction을 확인합니다

  • 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가 추가된것을 확인할 수 있습니다.

  • 이러한 ContractAdressCA라고 부르는데 CA 계정은 SmartContract가 생겼을때 생성되는 계정입니다.

  • 다시 말해 CAContract의 고유한 키값이라고 생각하면 됩니다.

  • SmartContract는 한번 배포하면 수정이 불가능합니다.

5. Smart Contract 실행하기 ( HelloWorld! 찍어보기 )

  • instance 생성하기

contract = eth.contract(abi)
eth.contractabi를 추가한 객체를 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이 되어야 TransactionEVM을 거치면서 값이 바뀌게 됩니다.
  • send()SmartContract 내용을 바꾸는 행위
  • 내용을 바꾸려면 EVM을 거쳐야 하기 때문에 무조건 비용이 발생합니다.
  • 바꾸려는 내용이 많을경우 가스비가 더 많이 나옵니다.

New를 사용하여 SmartContract 배포하기

  • 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

리믹스(Remix)는 브라우저에서 솔리디티 프로그래밍 언어로 스마트 계약 개발과 구축을 지원하는 통합개발환경(IDE)입니다.
위처럼 복잡한 프로세스를 자동으로 처리해주며 브라우저와 이더리움 블록체인에 연결해 스마트계약 배포와 테스트를 할 수 있습니다.

0개의 댓글