solc —bin <컴파일 할 sol 파일 이름> : 솔리디티 파일을 이진 형식으로 컴파일 하는 명령어
—optimize 옵션은 컴파일 전, 작성한 솔리디티 코드가 약 200회 실행된다고 가정했을 때를 기준으로 컨트랙트를 최적화 한다. 명령어를 실행하고 나면 16진수 이진코드가 출력된다.
solc를 사용해 ABI 생성하기
: ABI는 스마트 컨트랙트 코드에 대한 설명이 담긴 JSON 형식의 인터페이스이다. 이더리움 네트워크에 있는 각 노드는 지갑을 통해 상호작용하는데, 이때 JSON-RPC 형식의 데이터로 상호작용을 한다. 이 상호작용을 위한 데이터가 바로 ABI이다.
어떤 노드가 이더리움 네트워크에 올라가 있는 스마트 컨트랙트를 실행하고자 할 때, 바이트코드 형태라면 어떤 함수를 어떻게 실행해야 하는지 이해하기 어려울 것이다. ABI는 스마트 컨트랙트 코드에 있는 함수에 대해 정의하고, 컨트랙트에 있는 함수에 어떤 인자를 넣어야 하는지, 어떤 데이터가 반환되는지 등을 가지고 있으며, 노드가 컨트랙트를 실행하기 위해 어떤 작업을 수행해야 하는지 알려준다.
—abi 옵션을 사용해 컨트랙트의 ABI를 생성할 수 있다.

스마트 컨트랙트의 흐름
⇒ 스마트 컨트랙트 코드 작성 → 컴파일(ABI, 바이트 코드 생성) → 배포


배포
⇒ 배포는 배경이나 언어에 따라 여러 방법으로 가능하기 때문에, 더 자세한 사항은 보인의 환경 설정과 언어, 블록체인 네트워크를 확인해 봐야 한다. 배포에 성공하면 컨트랙트 주소가 생성된다.

이렇게 생성된 주소가 스마트컨트랙트 계정 주소 값이 되며, 이 주소값으로 스마트 컨트랙트를 활용할 수 있다.

트랜잭션 해시와 스마트 컨트랙트의 주소값을 전혀 다른 값이다.
트랜잭션 해시는 아래와 같은 내용이다.

input 값은 스마트 컨트랙트 소스를 컴파일 한 바이트 코드이다.
⇒ 일반 송금 거래에서는 스마트 컨트랙트 소스가 필요 없기 때문에 0x로 나타나지만 스마트 컨트랙트가 있는 경우에는 저렇게 길게 나타난다.
to에서 null은 보낸이만 있고 받는 이는 없다는 것이다. 스마트 컨트랙트는 특정 수신을 지정하지 않고 자신이 생성한 계약 코드를 블록체인에 올리기 때무에 당연히 송신자의 계정만 기록된다.
접근 및 사용
스마트 컨트랙트 주소를 이용하여 정보를 활용할 수 있다.
트랜잭션을 생성할 때 스마트 컨트랙트 주소를 사용하게 되면, 스마트 컨트랙트가 가지고 있는 메서드를 사용할 수 있다. 이더리움 블록체인에 있는 상태를 변경하거나 조회할 수 있다.
송금이나 스마트컨트랙트 등, 상태를 변경하는 경우엔 함수를 실행하겠다는 메시지를 담은 트랜잭션을 보내야 한다. 블록체인이 기록하는 것이기 때문이다.
반면, 스마트 컨트랙트의 변수값 등을 단순히 조회하는 경우에는 블록체인에 기록하지 않기 때문에 별도의 비용이 들지 않는다. 일반적인 트랜잭션과는 다르게 자신의 노드에 동기화된 블록 내 데이터를 읽어주는 트랜잭션 call을 한다. 트랜잭션 call은 데이터를 읽기만 하므로, 비용이 들지 않는다.
VScode를 비롯한 우리가 일반적으로 사용하는 데스크톱 IDE에서는 자체적으로 솔리디티 코드를 디버깅하거나 컴파일하는 기능이 없다. 따라서 솔리디티 코드를 컴파일, 배포, 테스트, 디버깅해주는 Truffle과 로컬환경에서 블록체인 테스트넷을 사용할 수 있게 해주는 Ganache를 함께 사용해야 한다.
웹 기반 IDE인 Remix는 솔리디티 개발을 위한 IDE이다. 자체적으로 솔리디티 개발을 위한 컴파일, 배포, 테스트, 디버깅 기능을 내장하고 있기 때문에 별도의 프레임워크나 라이브러리를 설치하지 않아도 쉽게 솔리디티 코드 작성부터 테스트넷 배포까지 할 수 있다.
로컬 컴퓨터에 Remix 코드 저장하기 - Remixd
package.json 설치 ⇒ npm init
remixd 설치⇒ npm install -g @remix-project/remixd
해당 디렉토리를 Remix IDE와 웹소켓으로 연결(해당 디렉토리에 코드 작성 후)
⇒ remixd -s <코드파일이 있는 폴더의 절대 경로> —remix-ide https://remix.ethereum.org
**리믹스에서 작성한 내용이 로컬 컴퓨터에 자동으로 반영되지만, 반대는 되지 않음…맞나?
simpleStorage.sol 이라는 코드를 작성했다고 가정하고 디렉토리에 저장!
solc —abi —bin simpleStorage.sol ⇒ solc를 사용해 컴파일, ABI와 바이트코드가 출력된다.
geth console 2> /dev/null —goerli ⇒ geth console 을 실행(goerli 네트워크)
var simpleAbi = [컴파일한 ABI로 초기화]
var simpleBytecode = “컴파일 한 바이트 코드로 초기화”
var simpleContract = eth.contract(simpleAbi) ⇒ eth.contract()를 사용해서 ABI를 설정
personal.unlockAccount(eth.accounts[0]) ⇒ geth 계정은 기본적으로 잠겨있으므로 배포할 계정의 락을 풀어줭 한다.
var contractObj = simpleContract.new({from: eth.accounts[0], data: simpleBytecode, gas:2000});
⇒ 위와같이 하면 배포가 시작된다. contractObj 객체를 통해 컨트랙트 정보를 얻을 수 있다.