BLOG
루프체인의 자바(Java) SCORE(Smart Contract on Reliable Environment)
2022.07.28
안녕하세요, 파라메타(PARAMETA)입니다.
스마트 컨트랙트(Smart Contract)
스마트 컨트랙트(Smart Contract)는 기존 서면으로 이루어지던 계약을 코드로 구현하고 특정 조건 충족 시 해당 계약이 이행되도록 하는 스크립트로서, 블록체인에서 실행되는 프로그램입니다. 블록체인의 특성을 이용해 누구나 코드와 그 결과를 확인할 수 있으며, 위변조 불가능한 실행 결과를 생성해 블록체인에 기록하게 됩니다. 특정 조건 성취 시 계약을 자동으로 이행하게 함으로써 계약의 집행 비용 및 분쟁 가능성을 줄일 수 있다는 것이 스마트 컨트랙트의 큰 장점입니다.
스마트 컨트랙트의 대표적인 예로 가상자산(FT, Fungible Token, 대체 가능 토큰)을 들 수 있습니다. 토큰의 소유자를 스마트 컨트랙트 내에 기록하고 토큰 이체를 프로그램으로 구현하여 자동으로 실행되게끔 한 것이죠. 이로써 제3자의 개입 없이도 토큰의 소유 및 이체가 가능해집니다.
기술적으로는 사용자가 생성한 트랜잭션(Transaction, TX, 스마트 컨트랙트의 메소드(Method) 호출)을 각 노드가 실행한 뒤 결과에 대한 합의를 거쳐 블록에 기록함으로써 실행에 대한 결과 위변조가 불가능하게 되어 있으며, 실행에 대한 코드 또한 블록체인상에 투명하게 공개되어 어떻게 동작하는지를 누구든 확인할 수 있다고 설명할 수 있겠습니다.
스마트 컨트랙트 동작 원리
스마트 컨트랙트는 블록체인상에서 실행되는 프로그램이지만 환경이 다른 여러 노드에서 실행되어야 하며, 합의가 가능하도록 결과가 결정적(Deterministic)이어야 합니다. 프로그램 내에 랜덤이나 외부 변수의 영향으로 노드마다 바뀔 수 있는 코드가 들어 있어서는 안 되며, 여러 스마트 컨트랙트가 동일 블록체인 내에서 실행되므로 하나의 스마트 컨트랙트가 길게 실행되는 것 또한 안 됩니다. 대부분의 블록체인이 가스 한도(Gas Limit)와 같은 것을 설정, 한 번에 실행 가능한 코드의 양을 제한하고 있기 때문이죠.
스마트 컨트랙트 작성을 위한 대표 프로그래밍 언어에는 이더리움의 솔리디티(Solidity)가 있습니다. 솔리디티는 앞서 언급한 스마트 컨트랙트의 제한 사항을 잘 반영할 수 있도록 새롭게 설계된 스마트 컨트랙트 전용 프로그래밍 언어로, 이더리움 가상머신(EVM, Ethereum Virtual Machine)상에서 실행되기 때문에 이더리움의 각 노드는 이더리움 가상머신을 포함하고 있습니다.
블록체인별로 스마트 컨트랙트 작성에 다양한 프로그래밍 언어를 사용하고 있는데요, 솔리디티(Solidity)를 비롯해 러스트(Rust), 파이썬(Python), 자바(Java) 등이 그 예입니다.
블록체인별 스마트 컨트랙트 언어
자바 스마트 컨트랙트
파라메타가 자체 개발한 루프체인(loopchain)의 스마트 컨트랙트 실행 환경은 SCORE(Smart Contract on Reliable Environment)인데요, SCORE는 스마트 컨트랙트 작성 언어로 파이썬과 자바를 지원합니다. 두 언어 모두 사용 개발자가 가장 많은 범용 프로그래밍 언어로서, 스마트 컨트랙트 개발 시 새로운 언어 습득이 필요 없도록 해 진입 장벽을 낮춰 줄 수 있습니다. 특히 자바의 경우 가장 잘 알려져 있고 안정적인 프로그래밍 언어인 동시에, 다수의 라이브러리와 프로그래밍 지원 도구들을 제공하고 있습니다.
그럼 지금부터 루프체인이 지원하는 자바 스마트 컨트랙트에 대해 알아볼까요?
자바 스마트 컨트랙트 구성
자바 스마트 컨트랙트는 다른 스마트 컨트랙트와 마찬가지로 크게 Data, Function, Event Log로 구성됩니다. 우선 Data는 블록체인 상태 데이터에 영원히 기록되는 것과 메모리상에 임시로 생성되는 데이터로 구분할 수 있습니다. 상태 데이터에 기록되는 것은 Class의 Member로 선언되고, 임시로 생성되는 데이터는 함수 내의 변수로 선언됩니다. Function은 자바의 메소드로서, 트랜잭션을 통해 호출되어 실행될 수 있습니다. Event Log는 Function 실행 중 생성되어 블록체인에 로그로 기록될 수 있도록 하고 있으며, 블록체인 내에서 특정 행위에 대한 트래킹이 용이하도록 합니다.
자바 스마트 컨트랙트 예시)
/* * Copyright 2020 PARAMETA Corp. * * Licensed under the Apache License, Version 2.0 (the “License”); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an “AS IS” BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.parameta.score.example; import score.Context; import score.annotation.External; import score.annotation.Payable; public class HelloWorld { private String name; public HelloWorld(String name) { this.name = name; } @External() public void setName(String name) { this.name = name; } @External(readonly=true) public String name() { return name; } @External(readonly=true) public String getGreeting() { String msg = “Hello ” + name + “!”; Context.println(msg); return msg; } @Payable public void fallback() { // just receive incoming funds } } |
* 보다 상세한 내용은 다음 링크에서 확인하실 수 있습니다. (https://www.icondev.io/icon-stack/smart-contracts)
스마트 컨트랙트로서의 자바
앞서 설명한 바와 같이 스마트 컨트랙트는 각 블록체인 노드상에서 실행되고 그 결과를 합의해야 하므로, 결과가 결정적이어야 합니다. 하지만 보통의 프로그래밍 언어는 구현 시 랜덤 요소를 포함하거나 외부 환경 변수에 의존하는 경우가 있습니다. 자바 또한 기본적으로는 이러한 변수를 포함하고 있어 프로그래밍 시 제약이 존재할 수 있으며, 이에 따라 실행 전 확인 필요한 사항들이 있습니다.
먼저 스마트 컨트랙트에서 사용 가능한 API(Application Programming Interface)만 적용해야 합니다. 이는 비결정적 결과를 내거나 외부 변수의 영향을 받는 API의 경우 사용이 불가함을 뜻합니다.
* 사용 가능 API 목록은 다음 링크에서 확인하실 수 있습니다. (https://www.icondev.io/support/advanced-topics/java-smart-contracts/allowed-methods)
그리고 스마트 컨트랙트의 제한된 API 사용 여부에 대한 검사나 스마트 컨트랙트 실행에 필요한 코드 삽입을 위해 기존 자바 프로그램 실행 전 바이트코드 최적화기(Bytecode Optimizer) 및 바이트코드 변환기(Bytecode Transformer)가 실행됩니다. 바이트코드 최적화기는 애노테이션(Annotation) 추출, API 매핑(Mapping), Event Log 함수의 ‘body’ 생성, 그리고 비용(Cost)을 줄이기 위한 코드 최적화 작업을 수행합니다. 바이트코드 변환기(Bytecode Transformer)는 프로그램의 실제 실행 전 허용된 API 사용 여부를 검사하며, JCL class를 매핑하고 비용 계산을 위한 코드를 추가하는 등 스마트 컨트랙트 실행 시 제한 필요한 여러 사항을 처리합니다.
블록체인상에서의 자바 프로그램 실행 과정
자바 스마트 컨트랙트의 장점
자바는 안정적이고 다양한 라이브러리 및 개발 도구를 지원하는 프로그래밍 언어로서 많은 개발자들이 사용하고 있는 만큼, 스마트 컨트랙트 개발에 빠르게 적응할 수 있습니다. 자바는 특히 백엔드 서버 개발에 많이 사용되고 있는데요, 스마트 컨트랙트가 일종의 백엔드 서버 역할을 하는 프로그램이므로 백엔드 개발자의 참여가 좀 더 쉬워질 수 있겠습니다.
또한 자바는 가상머신(Virtual Machine) 기반의 실행 환경을 제공하고 있음에도 JIT(Just in Time) 기술을 이용하여 거의 네이티브 프로그램과 같은 수준의 성능을 보입니다. 블록체인의 성능에 있어 트랜잭션의 처리 속도가 가장 큰 장애물(Bottleneck)인데, 자바 혹은 파이썬과 같은 스크립트(Script) 언어나 EVM과 같은 가상머신 기반의 프로그램은 속도의 한계를 가지게 될 수밖에 없습니다.
자바로 작성된 스마트 컨트랙트(javaee)와 파이썬으로 작성된 스마트 컨트랙트(pyee3)의 성능을 비교한 그래프를 보면, 자바의 성능이 월등함을 확인할 수 있습니다. (자바로 작성된 스마트 컨트랙트는 static, instance 등 다양한 환경에서 측정합니다.)
자바와 파이썬으로 구현된 스마트 컨트랙트 성능 비교
* 참고 자료
https://www.icondev.io/getting-started/how-to-write-a-smart-contract