이더리움 블록체인_Web3.js 스마트컨트랙트 실행하기

스마트나
5 min readOct 5, 2018

--

이번 포스팅은 Web3.js를 통해서 스마트컨트랙트를 실행하는 방법을 포스팅하겠습니다. 스마트컨트랙트를 실행하기에 앞서서 우선 Solidity란 무엇이고 어떻게 작성해야 되는지에 대해서 알아보겠습니다.

- Solidity

솔리디티는 JAVA의 객체지향과 매우 비슷한 구조라고 생각하시면 됩니다. 여기서 JAVA의 객체지향을 모르신다면 기본적으로 객체지향에 대해서는 알고있어야 기본적으로 solidity를 아실수 있을거에요.

Solidity은 Contract라는 클래스 파일과 여러개의 기능을 하는 Function으로 나누어집니다. 객체지향처럼 클래스 안에 변수를 선언하는 것처럼 컨트랙트에 올라갈 변수를 작성하죠.

위 컨트랙트는 광고컨트랙트로 해당 광고에 대한 정보를 블록체인에 올라가는 Solidity 언어입니다. 잠깐 변수타입에 대해서 간단히 알아보죠. 참고로 나머지 변수들은 JAVA를 아신다면 충분히 아실 수 있는 내용이라 생략하겠습니다.

- address : address는 사전정의 그대로 블록체인으로 생성된 account들을 저장하는 변수입니다.

- mapping : mapping ( KeyType => ValueType ) public name; 형식이며 맵과 사전과 같은 자료구조로서 키와 값을 매핑하기 위해 사용합니다.

(ex : mapping(address => uint) public Ethereum 이면 Ethereum[0], Ethereum[1] 같이 배열로 사용할 수 있습니다.)

- msg.sender : 스마트컨트랙트를 실행하는 Address(이더리움 계좌) 입니다.

- 스마트컨트랙트

Web3로 스마트컨트랙트를 실행하는 방법은 컨트랙트를 Deploy하고 그 값을 abi코드로 블록체인에 올리면 됩니다. 우리가 할 스마트컨트랙트는 매우 간단한 코드입니다.

간단하게 변수에 Hello World를 할당하고 say() Call을 이용해서 직접 Hello World를 출력해봅시다. 저는 HelloWorld.sol파일을 /contracts/HelloWorld.sol 경로에 저장하였습니다.

# 스마트컨트랙트 컴파일

Solc모듈과 fs모듈을 이용하여 해당 스마트컨트랙트를 컴파일 합니다. solc은 solidity를 JSON형태로 컴파일 해주는 모듈입니다. 즉 solc로 컴파일된 JSON파일을 abi와 bytecode로 나누어서 저장해야 합니다.

JavaScript에는 JSON.parse라는 함수와 bytecode로 변환시켜주는 함수가 내장되어 있습니다. 이를 잘 활용해서 위 코드처럼 작성해주시면 됩니다.

# 스마트컨트랙트 Deploy

제일먼저 web3.eth.Contract를 통해서 객체를 생성해야 합니다. 단 이때 변수 값은 abi가 들어가야 합니다. (Deploy를 하기 위해서는 객체 생성시 abi만 변수로 넣으면 됩니다.) Deploy는 위에서 컴파일한 bytecode와 스마트컨트랙트를 실행할 account를 적어주세요. 그리고 이 값을 ABI값으로 변경하면 됩니다. (여기서 GasLimit와 GasPrice은 제 임의로 지정하였습니다.)

그리고 getTransactionCount 함수를 사용하여 Nonce값을 구하고, Object의 data에는 ABI값이 저장된 deploy로 할당하면 됩니다.(단 여기서 중요한 것은 abi로 변환한 값을 hex값 형식으로 변환해야합니다. 때문에 ‘0x’를 앞에다가 붙여준 것이에요)이 Object를 web3.eth.sendSignedTransaction 함수를 통해서 트랜잭션을 이더리움블록체인에 실행시키면됩니다.

이처럼 contractAddress가 이상없이 생성됬다면 스마트컨트랙트가 이더리움 블록체인에 정상적으로 등록된 것입니다. 실제 스마트컨트랙트의 함수를 Call할 때에도 이 contractAddress만 있으면 언제든지 call이 가능하죠. 트랜잭션Hash 로그는 https://ropsten.etherscan.io/tx/transactionhash값에서 확인할 수 있습니다.

# 스마트컨트랙트 실행

컨트랙트 실행시에는 객체 생성 시 변수값에 위 Contract Address값을 넣어주고 객체를 생성해줍니다. 그리고 그 객체를 Call 해주면 이상없이 호출 되는 것을 볼 수 있죠. 중요한 것은 앞서 스마트컨트랙트를 실행시킨 트랜잭션 Hash값을 알고 있어야 된다는 점입니다. 때문에 DAPP을 개발하게 되면 Contract Address를 어떻게 관리할지에 대한 고민이 필요합니다.

--

--

스마트나

금융 IT 개발자, 블록체인 DAPP 개발자, 서버 및 SQL개발