위험 경고: '가상화폐', '블록체인'이라는 이름으로 불법 자금 모집 위험에 주의하세요. — 은행보험감독관리위원회 등 5개 부처
검색
로그인
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt
BTC
ETH
HTX
SOL
BNB
시장 동향 보기
[가상머신 칼럼] ava 스마트 컨트랙트 이해를 위한 글 - JVM on the chain
趣链科技 QTech
特邀专栏作者
2021-08-30 03:53
이 기사는 약 3377자로, 전체를 읽는 데 약 5분이 소요됩니다
우리 모두가 알고 있듯이 Java는 널리 사용되는 객체 지향 프로그래밍 언어로 "한 번 작성하고 모든 곳에서 실행"하는 크로스 플랫폼 기능이 있습니다.

-- 가이드 --

이전 기사에서는 가상 머신의 역사, 특성, 개발, Solidity 및 EVM에 대한 자세한 소개를 소개했습니다. 솔리디티와 EVM의 등장으로 블록체인 애플리케이션 시나리오의 새로운 문이 열렸지만 계약 개발자는 솔리디티를 사용하여 스마트 계약을 개발하고 새로운 언어를 배우는 문제가 불가피합니다.

그렇다면 "계약 개발자"와 "블록체인"을 빠르게 통합할 수 있는 그런 오랜 친구가 있습니까?

우리 모두가 알고 있듯이 Java는 널리 사용되는 객체 지향 프로그래밍 언어로 "한 번 작성하고 모든 곳에서 실행"하는 크로스 플랫폼 기능이 있습니다. 따라서 우리는 블록체인 플랫폼에 Java를 도입하고 Java 스마트 계약을 실행할 수 있는 일련의 실행 엔진 HVM을 개발했습니다. Java 스마트 계약을 블록체인에 도입하면 주로 다음과 같은 목적을 수행합니다.

* 스마트 계약 개발 비용을 줄여 계약 개발자가 문법 세부 사항이 아닌 계약 논리 자체에 집중할 수 있습니다.

*반복적인 "바퀴 만들기"를 피하면서 개발자에게 블록체인 시나리오에 적합한 친숙한 도구와 방법을 제공합니다.

* 전통적인 스마트 계약과 원장 간의 단일 상호 작용 모드 문제를 해결하고 비즈니스 시나리오의 요구를 더 잘 충족하기 위해 원장 상호 작용을 위한 보다 편리하고 유연한 다양한 데이터 구조 및 방법을 제공합니다.

텍스트

텍스트

계약 개발자의 관점에서 Java 스마트 계약을 사용하는 프로세스에는 일반적으로 계약 개발, 계약 배포 및 계약 호출의 세 단계가 포함됩니다.

▲ 자바 컨트랙트 개발

전통적인 스마트 계약과 비교할 때 Java 스마트 계약의 개발 및 사용은 주로 다음과 같이 더 간단하고 편리합니다.

1) 빠른 프로젝트 구성: 개발자는 로컬 IDE에서 새 Java 프로젝트를 만들고 계약 개발 종속성 패키지를 가져오기만 하면 계약을 개발할 수 있습니다. 코딩이 완료되면 코드가 계약 Jar 파일로 패키징되어 체인에 배포하는 데 사용할 수 있습니다.

2) 많은 도구와 방법이 있습니다. 개발자는 "바퀴 만들기"를 반복하는 문제를 피하기 위해 JDK의 클래스와 방법을 사용할 수 있습니다.

3) 낮은 학습 비용: Java 언어가 널리 사용되며 대부분의 개발자는 계약 개발 종속성 패키지의 인터페이스만 이해하면 Java 스마트 계약을 능숙하게 사용할 수 있습니다.

▲자바 컨트랙트 전개

Java 스마트 계약 배포를 위해 개발자는 트랜잭션을 통해 계약 Jar 패키지를 체인에 업로드하고 블록체인은 계약을 초기화하고 고유한 계약 주소를 생성하며 트랜잭션 영수증을 통해 계약 주소를 개발자에게 전달합니다.


▲자바 컨트랙트 콜

개발자는 계약 주소를 지정하고 계약 메서드 이름과 매개 변수를 입력하여 계약 호출 트랜잭션을 구성하고 보낼 수 있습니다. 블록체인 플랫폼은 트랜잭션을 수신한 후 JVM 인스턴스를 획득하고 계약 주소에 해당하는 계약 Jar의 클래스 파일을 JVM에 로드하고 계약 클래스의 인스턴스를 생성하고 지정된 메서드를 호출하고 실행 결과를 획득하여 반환합니다. 트랜잭션 영수증을 통해 개발자에게 By.


——HVM 상세 설명——

▲ 블록체인에 대한 JVM 액세스

Java 스마트 계약 실행 엔진을 구현하려면 JVM을 블록체인에 연결하는 문제를 피할 수 없습니다. 현재 대부분의 블록체인 시스템은 Golang을 사용하여 개발되며 대부분의 오픈 소스 JVM은 일반적으로 C++로 작성됩니다. JVM을 블록체인 시스템에 빠르게 연결하려면 CGO를 통해 Golang과 C++를 연결할 수 있습니다. 그러나 블록체인 시스템에서 JVM의 내부 최적화 필요성을 고려하여 HVM은 Golang을 통해 JVM을 구현하기로 결정했습니다. JVM을 직접 구현하면 많은 개발 비용이 발생하지만 블록체인 시나리오에 대한 후속 성능 최적화 및 기능 확장 작업을 크게 용이하게 합니다.

"JVM이 블록체인에 연결되면 JVM을 블록체인의 Java 계약 실행 엔진으로 만들기 위해 무엇을 더 수행해야 합니까?"

▲가상 머신 보안 적응

위에서 언급한 바와 같이 우리는 사용자가 블록체인의 Java 계약 엔진에서 JDK의 클래스와 메서드를 사용할 수 있도록 지원합니다. 블록체인의 계약 실행 엔진이 실행 환경의 격리와 실행 결과의 확실성을 충족해야 한다는 점을 고려하여 JDK 및 JVM에 대한 보안 적응이 필요합니다. 여기에는 다음이 포함됩니다.

1) "안전하지 않은" 클래스 및 메서드 비활성화: 스마트 계약 엔진에서 일관성 없는 실행 결과를 초래할 수 있는 메서드는 "안전하지 않음"입니다. 예를 들어 Java에서 생성된 난수 방법의 실행 결과는 불확실하며 블록체인의 Java 계약 엔진은 이러한 "안전하지 않은" 클래스와 방법을 비활성화합니다.

2) 계약 실행 환경 분리: 블록체인 플랫폼의 Java 스마트 계약은 격리된 실행 환경이 필요합니다. 즉, Java 스마트 계약은 스레드, 네트워크, 액세스 시스템 시간 및 일반 Java 프로그램과 같은 기타 기능을 사용할 수 없습니다. 또한 JDK에서 일부 블록체인 관련 메서드를 구현했으며 일부 메서드는 Java 계약에서 호출할 수 없습니다. 따라서 허용되지 않는 메서드 호출을 가로채기 위해 HVM 내부에 메서드 호출 필터를 구현했습니다.

3) 논리 실행 순서 결정: EVM과 마찬가지로 계약 실행 비용을 계산하기 위해 HVM 내부에 일련의 가스 메커니즘을 구현했습니다. 명령 실행의 차이로 인해 서로 다른 노드에서 계산된 가스 값이 달라집니다. 원래 JDK에서는 일부 메서드를 두 번 호출하면 결과는 같지만 논리 실행의 코드 경로가 다릅니다. 싱글톤 패턴을 사용하는 클래스를 예로 들면, 이 클래스의 인스턴스 메소드를 처음 호출할 때 이 클래스의 인스턴스를 생성해야 하며, 이후 해당 메소드를 호출할 때 더 이상 인스턴스를 생성할 필요가 없습니다. 이러한 논리의 차이로 인해 새로 시작된 노드의 가스 값이 다른 노드의 가스 값과 일치하지 않게 됩니다. 따라서 논리 실행 순서가 항상 일관되도록 JDK에서 이러한 종류의 논리를 적용해야 합니다.

▲원장 상호 작용 메커니즘

JVM을 블록체인에 연결하기 위해서는 계약과 원장 데이터 간의 상호 작용 기능도 보장해야 합니다. EVM에는 원장 상호작용에 대한 지침이 있지만 JVM 사양에는 원장 상호작용에 대한 지침이 없으므로 Java 스마트 계약이 블록체인에서 원장 데이터를 작동할 수 있도록 일련의 원장 데이터 상호작용 메커니즘을 제공해야 합니다.

원장 상호 작용 메커니즘을 구현하기 위한 두 가지 옵션이 있습니다.

1) JVM에서 원장 상호 작용을 위한 일련의 사용자 지정 지침 세트를 구현합니다. 동시에 Java 계약용 컴파일러 또는 플러그인이 제공되어 계약 바이트코드의 블록체인에서 원장 상호 작용 전용 사용자 지정 지침을 생성합니다.

2) JDK에서 원장 데이터를 읽고 쓰기 위한 일련의 도구 클래스 및 메서드를 구현합니다.계약 실행 프로세스 중에 계약 실행 엔진은 이러한 메서드를 호출하여 계약 영구 필드의 읽기 및 쓰기 작업을 담당합니다.

HVM을 구현하는 동안 두 번째 옵션이 선택되었습니다. 계약 실행 과정에서 계약의 영구 필드를 사용하는 경우 계약 실행 엔진은 책 읽기 메서드를 호출하여 책에서 데이터를 가져옵니다. 원장 쓰기 작업의 경우 실행 엔진이 먼저 캐시하고 계약 실행이 완료된 후 데이터 업데이트가 있는 계약의 영구 필드를 스캔하고 업데이트된 데이터를 원장에 플래시합니다.

명령 방식과 비교할 때 Java 방식을 사용하여 원장 데이터 상호 작용 기능을 구현하면 명령 오버헤드가 더 많이 발생하지만 사용자에게 영구 필드를 보다 친숙하게 조작할 수 있는 방법을 제공할 수 있습니다. Map을 예로 들면 Java 스마트 컨트랙트에서 Get, Put 이외의 메소드를 Map에 제공하여 사용자가 Iterator 및 기타 메소드를 사용하여 Map을 쉽게 조작할 수 있도록 합니다. 맵을 읽고 쓰는 복잡한 시나리오를 고려할 때 신뢰할 수 있는 반복자 논리를 유지하는 것은 더 복잡합니다. 원장 데이터를 명령 형태로 작동하려면 복잡한 원장 상호 작용 명령 집합을 구현해야 합니다. 분명히 도구 클래스와 메서드는 이러한 복잡한 논리 작업을 완료하는 데 더 적합하며 계약 데이터 구조 기능의 확장을 지원하는 것이 더 쉽습니다.


이 방식을 통해 사용자는 Java 스마트 계약을 작성할 때 강력한 데이터 구조 클래스 작업 원장을 선택할 수 있습니다. 이러한 데이터 구조 클래스는 원장 상호 작용의 Java 메서드를 캡슐화하여 사용자가 인식할 수 없도록 하고 가능한 한 JDK에서 인터페이스를 구현합니다. HVMMap, HVMList와 같은 데이터 구조는 각각 JDK에서 Map 및 List 인터페이스를 구현하며 JDK에서 제공하는 다른 Map 및 List와 거의 동일합니다.

▲가상 머신 비교 분석

HVM 계약 외에도 일반적인 계약에는 EVM의 Solidity 계약, Fabric의 Chaincode 등이 포함됩니다.

EVM은 완전히 격리된 샌드박스 계약 실행 환경을 제공합니다. Solidity는 디자인 초기부터 스마트 컨트랙트 언어로 여겨져 왔으며 장부 운영에 큰 장점이 있습니다.

Fabric의 Chaincode는 여러 언어로 쓰기를 지원합니다. 체인코드는 보호된 Docker 컨테이너에서 실행됩니다.클라이언트가 보낸 호출 요청을 수신한 후 컨테이너에서 가계부의 읽기 및 쓰기 세트를 시뮬레이션하고 클라이언트에 반환합니다.마지막으로 클라이언트는 시뮬레이션된 트랜잭션을 다시 시작합니다. . 원장에 대한 읽기-쓰기 세트 쓰기 요청을 생성합니다.

다른 실행 엔진과 비교하여 HVM에는 다음과 같은 주요 기능이 있습니다.

*HVM 계약은 높은 보안성을 갖춘 안전한 폐쇄형 샌드박스 환경에서 실행됩니다.

*플랫폼에 내장된 실행 엔진, 네트워크 의존성 없음

*HVM은 완전한 계약 수명 주기 관리 메커니즘을 제공하며 계약은 SDK 및 API 호출을 통해서만 업그레이드할 수 있습니다.

* 로그 출력, 암호 제품군 및 다양한 호출 계약과 같은 풍부한 내장 기능 제공

Java 언어 JDK 자체에서 제공하는 기능 외에도 HVM은 블록체인 원장 데이터 연산을 기반으로 다양한 데이터 구조를 제공합니다.

-- 요약 --

이 기사는 먼저 개발자 관점에서 Java 스마트 계약의 개발 및 사용 프로세스를 소개한 다음 블록체인에서 JVM에 액세스하기 위한 기술 솔루션을 설명하고 JDK의 코드 변환 및 원장 상호 작용 메커니즘의 구현에 대해 설명합니다. HVM은 더 나은 성능과 더 친숙한 사용자 경험을 목표로 항상 모색하고 있습니다. 그와 동시에 업계에서는 계약 실행 엔진이 활짝 피어나고 있습니다.다음으로 스마트 계약 작성을 위해 Rust 및 기타 언어를 지원하는 FVM과 블록체인에서 SQL 실행을 지원하는 KVSQL에 대해 자세히 소개하겠습니다. 조정!

저자 소개







저자 소개

루이밍, 야오빙

참조

참조

[1] 자바 가상 머신 사양.


1inch
스마트 계약
Odaily 공식 커뮤니티에 가입하세요