KR20200021993A - 블록체인 컴파일러 - Google Patents

블록체인 컴파일러 Download PDF

Info

Publication number
KR20200021993A
KR20200021993A KR1020207001661A KR20207001661A KR20200021993A KR 20200021993 A KR20200021993 A KR 20200021993A KR 1020207001661 A KR1020207001661 A KR 1020207001661A KR 20207001661 A KR20207001661 A KR 20207001661A KR 20200021993 A KR20200021993 A KR 20200021993A
Authority
KR
South Korea
Prior art keywords
blockchain
code
stack
script
compiler
Prior art date
Application number
KR1020207001661A
Other languages
English (en)
Other versions
KR102608500B1 (ko
Inventor
크레이그 스티븐 라이트
스테판 사바나
Original Assignee
엔체인 홀딩스 리미티드
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from GBGB1710967.9A external-priority patent/GB201710967D0/en
Priority claimed from GBGB1710974.5A external-priority patent/GB201710974D0/en
Priority claimed from GBGB1710971.1A external-priority patent/GB201710971D0/en
Application filed by 엔체인 홀딩스 리미티드 filed Critical 엔체인 홀딩스 리미티드
Publication of KR20200021993A publication Critical patent/KR20200021993A/ko
Application granted granted Critical
Publication of KR102608500B1 publication Critical patent/KR102608500B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45508Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/06Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols the encryption apparatus using shift registers or memories for block-wise or stream coding, e.g. DES systems or RC4; Hash functions; Pseudorandom sequence generators
    • H04L9/0618Block ciphers, i.e. encrypting groups of characters of a plain text message using fixed encryption transformation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/06Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols the encryption apparatus using shift registers or memories for block-wise or stream coding, e.g. DES systems or RC4; Hash functions; Pseudorandom sequence generators
    • H04L9/0618Block ciphers, i.e. encrypting groups of characters of a plain text message using fixed encryption transformation
    • H04L9/0637Modes of operation, e.g. cipher block chaining [CBC], electronic codebook [ECB] or Galois/counter mode [GCM]
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/06Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols the encryption apparatus using shift registers or memories for block-wise or stream coding, e.g. DES systems or RC4; Hash functions; Pseudorandom sequence generators
    • H04L9/0643Hash functions, e.g. MD5, SHA, HMAC or f9 MAC
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/32Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
    • H04L9/3247Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving digital signatures
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/32Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
    • H04L9/3297Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials involving time stamps, e.g. generation of time stamps
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/50Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols using hash chains, e.g. blockchains or hash trees
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L2209/00Additional information or applications relating to cryptographic mechanisms or cryptographic arrangements for secret or secure communication H04L9/00
    • H04L2209/56Financial cryptography, e.g. electronic payment or e-cash
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L63/00Network architectures or network communication protocols for network security
    • H04L63/14Network architectures or network communication protocols for network security for detecting or protecting against malicious traffic
    • H04L63/1441Countermeasures against malicious traffic
    • H04L63/1458Denial of Service

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Computing Systems (AREA)
  • Power Engineering (AREA)
  • Devices For Executing Special Programs (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Financial Or Insurance-Related Operations Such As Payment And Settlement (AREA)
  • Stored Programmes (AREA)
  • Document Processing Apparatus (AREA)

Abstract

고급 언어(HLL)로 작성된 소스 코드의 일부를 블록체인 플랫폼 상에서 실행하는 것을 가능하게 또는 용이하게 하는 컴퓨터-구현 방법(및 상응하는 시스템)이 제공된다. 방법 및 시스템은 고급 소스 코드의 일부를 블록체인 플랫폼과 함께 사용될 수 있는 형태로 변환하도록 배열되는 블록체인 컴파일러를 포함할 수 있다. 이는 비트코인 블록체인 또는 대안적인 블록체인일 수 있다. 방법은, 소스 코드의 일부를 입력으로서 수신하는 단계, 및 복수의 op_code를 포함하는 출력 스크립트를 생성하는 단계를 포함할 수 있다. op_code들은 기능적으로 제한된 블록체인 스크립팅 언어에 대하여 고유한 op_code들의 서브세트이다. 출력된 스크립트는, 실행시에, 해당 스크립트가 소스 코드에서 지정되는 기능을 적어도 부분적으로 제공하도록 배열 및/또는 생성된다. 블록체인 스크립팅 언어는 점프-기반 루프 또는 그 밖의 재귀 프로그래밍 구문을 통한 복잡한 제어 흐름 구문 또는 재귀를 기본적으로 지원하지 않도록 제한된다. 출력 스크립트를 생성하는 단계는 소스 코드에 제공되는 적어도 하나의 루핑 구문을 언롤링하는 단계를 포함할 수 있다. 방법은 출력 스크립트를 블록체인 플랫폼 상에서 실행 가능한 형태로 변환하도록 배열되는 인터프리터 또는 가상 기계를 제공 또는 사용하는 단계를 더 포함할 수 있다.

Description

블록체인 컴파일러
본 개시물은 일반적으로 분산 원장 기술에 관한 것으로, 특히, 예를 들어, 비트코인 네트워크 및 연계 프로토콜과 같은 블록체인 기술에 관한 것이다. 또한, 본 개시물은 컴퓨터 기반 코드의 변환을 위한 컴파일러 및 컴파일러 관련 기술에 관한 것이기도 하다. 본 발명의 하나 이상의 실시형태는 기능적으로 제한된 스크립트 기반 언어를 포함하는 블록체인 플랫폼 또는 프로토콜에서 고급(high-level) 프로그램의 자동화 및 실행을 가능하게 하거나 및/또는 용이하게 하는 해법으로서 사용하기에 적합하다.
본 명세서에 있어서는, '블록체인(blockchain)'이라는 용어를 모든 형태의 전자적인, 컴퓨터-기반의, 분산 원장을 포함한다는 의미로 사용한다. 이는 컨센서스-기반의 블록체인 및 트랜잭션-체인 기술, 허가 및 무허가 원장, 공유 원장 및 이들의 변형을 포함한다. 다른 블록체인 구현예들이 제안되고 개발되었지만, 가장 널리 알려져 있는 블록체인 기술의 용례는 비트코인 원장이다. 본 명세서에서는 편의 및 예시의 목적으로 비트코인이 인용될 수 있지만, 본 발명은 비트코인 블록체인에 사용하는 것으로 한정되지 않으며 대안적인 블록체인 구현예 및 프로토콜도 본 발명의 범위 내에 속하는 것이라는 점에 유의해야 한다. "사용자"라는 용어는 본 명세서에서는 인간 또는 프로세서 기반 리소스를 의미할 수 있다.
블록체인은 결국 트랜잭션들로 구성된 블록들로 구성되는 컴퓨터-기반의 탈-중앙집중형 분산 시스템으로 구현된 피어-투-피어(peer-to-peer) 전자 원장이다. 각각의 트랜잭션은 블록체인 시스템 참여자들 사이의 디지털 자산의 제어의 전송을 인코딩하는 데이터 구조이며, 적어도 하나의 입력 및 적어도 하나의 출력을 포함한다. 각각의 블록이 이전 블록의 해시를 포함하고, 해당 블록들이 함께 연쇄되어 그 개시 이래로 블록체인에 작성된 모든 트랜잭션의 영구적인 불변의 레코드를 생성한다. 트랜잭션은 그 입력 및 출력에 내재된 스크립트라고 하는 소규모 프로그램을 포함하고, 이는 트랜잭션의 출력에 액세스할 수 있는 방법 및 대상을 특정한다. 비트코인 플랫폼의 경우, 이러한 스크립트는 Script라고 하는 스택(stack)-기반 스크립팅 언어를 사용해서 작성된다. 스크립트는 인터프리터에 의해 실행 가능 코드로 변환되는 명령(op_code)을 사용해서 작성된다.
블록체인에 트랜잭션이 작성되게 하기 위해서는, 트랜잭션이 "유효성 검증(validated)"되어야 한다. 네트워크 노드(채굴자)는, 각각의 트랜잭션이 유효함을 보장하고, 무효한 트랜잭션이 네트워크로부터 거부되게 하는 작업을 수행한다. 노드에 인스톨된 소프트웨어 클라이언트는 아직 소비되지 않은 트랜잭션(UTXO)에 대하여 그 잠금 및 잠금 해제 스크립트를 실행함으로써 이 유효성 검증 작업을 수행한다. 잠금 및 잠금 해제 스크립트의 실행이 TRUE로 평가되고 가능하게는 다른 검사가 통과되면, 트랜잭션은 유효한 것으로 간주될 수 있고 블록체인에 포함시키기 위해 트랜잭션이 채굴될 수 있다. 따라서, 블록체인에 트랜잭션이 작성되게 하기 위해서는, 트랜잭션은 i) 트랜잭션을 수신하는 제1 노드에 의해 유효성 검증되어야 하고 ― 트랜잭션이 유효성 검증되면, 해당 노드가 네트워크 내의 다른 노드들에 트랜잭션을 중계하고; ii) 채굴자에 의해 구축되는 신규 블록에 추가되어야 하고; iii) 채굴, 즉 과거 트랜잭션들의 공공 원장에 추가되어야 한다.
암호화폐 사용의 구현에 대해서는 블록체인 기술이 가장 널리 알려져 있지만, 디지털 기업가는 비트코인을 기반으로 하는 암호화폐 보안 시스템 및 새로운 시스템을 구현하기 위해 블록체인에 저장될 수 있는 데이터를 모두 사용하는 것을 모색하기 시작했다. 블록체인이 암호화폐의 영역에 한정되지 않는 자동화된 작업 및 프로세스에 대하여 사용될 수 있는 것이 매우 유리할 것이다. 이러한 해법은 블록체인의 이점(예컨대, 이벤트에 대한 영구적인 변조 방지 레코드, 분산 처리 등)을 활용할 수 있으면서, 그 응용에 있어서 더욱 범용성이 있다. 따라서, 초창기의 인터넷 채택 및 뒤이은 웹-기반 시스템의 개발 붐과 유사하게, 새로운 응용 및 기술 혁신을 위한 기술의 폭 넓은 채택이 필요할 수 있다.
그러나, 예를 들어, 이와 같이 스크립팅 언어로 프로그램을 작성하는 것은 저급(low-level) 프로그래밍 기술과 관련된 지식 및 숙련도를 필요로 하기 때문에 직관적이지 않거나 또는 보다 넓은 프로그래밍 커뮤니티에 의해 손쉽게 채택 가능한 것이 아니다. 프로그래머는 스택(들) 및 그 안의 데이터의 장소를 고려할 필요가 있다. 저급 op_code로 구성된 프로그램을 작성하는 것은 C, Java 등과 같은 고급 언어(high-level language)(HLL)로 소스 코드를 작성하는 것에 비해 더욱 시간 및 노동 집약적이다. 이러한 HLL용으로 구축되는 컴파일러/인터프리터는 프로그래머가 메모리 관리 등과 관련된 더욱 힘든 낮은 수준의 문제점으로부터 벗어나게 하는 편리한 추상화 계층을 제공한다. 하나 이상의 스택에서 데이터를 조작하기 위해 op_code 시퀀스를 작성하는 것은 HLL로 소스 코드를 작성하는 것보다 기술적으로 복잡하고 시간 소모적이다. 따라서, 저급 op_code를 사용하는 것은 어렵기 때문에, 에러 및 버그가 발생할 가능성이 더 높다.
또한, HLL은 프로그래머가 그 소스 코드에 루프(loops), 케이스 스테이트먼트(case statements) 및 재귀 호출(recursive calls; 순환 호출)과 같은 복잡한 제어 플로우 구조를 포함시킬 수 있게 한다. 프로그래머는 원하는 논리에 집중할 수 있으며, "이것이 참인 동안, ... X 한다"와 같은 메커니즘을 갖는 직관적인 방식으로 논리 흐름을 표현할 수 있다. 그러나, Bitcoin's Script와 같은 일부 블록체인-연계 스크립팅 언어는, 산술 연산과 같은 전형적인 연산자는 물론이고 해싱 연산자 및 서명 검증과 같은 암호화 함수를 포함하는 반면, while 루프(while loop; 반복제어문)와 같은 복잡한 제어 구조에 대한 고유한 프리미티브(primitive)를 포함하지 않거나, 또는 HLL에서 사용할 수 있기 때문에 재귀 기법의 사용을 허용한다는 점에서 기능적으로 제한된다. 이러한 제한된 언어는 점프(jump) 기반의 제어 흐름을 지원하지 않는다. 따라서, 의도적으로, 소스 코드에 포함시키기 위해 프로그래머에게 공급되는 언어 및 논리 구문을 제한한다. 이로 인해, 일부 사람들은 Script와 같은 제한된 언어가 비-튜링 완전성(non-Turing complete)이라고 주장하게 되었지만, 이 정의는 다른 사람들에 의해 이론이 제기되고 있다. 따라서, 우리는 "기능적으로 제한된(functionally restricted)"이라는 문구를 사용할 것이다.
이 의도적인 제한이 프로그래머에게 코딩 프로세스를 더 어렵게 만들 수 있지만, 결국에는 프로그램 실행 시간이 한정되고, 중요하게는, 악의적인 이용 행위를 방지하기 때문에, 예컨대 서비스 거부(DoS) 공격을 구현하기 위한 무한 루프의 사용을 방지하기 때문에, 중요한 보안 메커니즘을 제공하게 된다는 점에 유의한다.
따라서, 중대한 보안과, 블록체인 기반 기술의 개발을 촉진, 장려 및 개선할 필요성과의 사이에는 상충하는 부분이 있다. 후자의 문제점을 해결하기 위해, 이더리움(Ethereum)은 HLL 언어를 그 블록체인 플랫폼에 고유한 특징으로서 포함한다. Script와 마찬가지로, 실행 가능한 버전의 코드를 생성하려면 저급 인터프리터가 필요하다. Ether로서 알려진 이더리움의 HLL 언어는 조건부 및 무조건적인 점프의 사용을 통해 제어-흐름이 실행될 수 있게 한다. 재귀도 허용한다. DoS 공격과 같은 문제를 피하기 위해, 이더리움은 실행 비용을 충당하기 위해 미리 지불된 암호 화폐의 일부인 가스(gas)의 개념을 도입함으로써 트랜잭션 실행 시간을 제한한다. 따라서, 고유한 HLL을 사용하기 때문에 추가적인 기술적 및 상업적 복잡성 계층이 필요해진다. 부가적으로, 이더리움은 현재까지 적어도 하나의 중대한 재귀 기반의 공격으로 고통받고 있다. 예를 들어, http://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/을 참조한다.
따라서, 프로그래머가 기능적으로 제한된 스크립팅 언어에 의해 제공되는 보안을 훼손하지 않으면서도 그들에게 친숙한 HLL 언어를 사용해서 보다 쉽고, 빠르고, 효율적인 방식으로 유효한 블록체인 해법을 개발하고, 설계하고, 생성할 수 있게 하는 메커니즘을 제공하는 것이 바람직하다. 이는 결코 사소한 작업이 아니며, 상당한 정도의 기술적인 혁신을 필요로 한다. 이는, 다른 무엇보다도, 본 개시물에 의해 해결되는 기술적인 문제들 중 하나이다.
따라서, 본 개시물에 따르면, 첨부된 청구항들에서 정의되는 바와 같은 시스템(들) 및 상응하는 방법(들)이 제공된다.
본 개시물에 따르면, 컴퓨터-구현 방법 및 상응하는 시스템(들)이 제공될 수 있다. 방법은 블록체인 플랫폼 상에서 소스 코드의 일부의 실행을 가능하게 또는 용이하게 하도록 배열될 수 있다. 소스 코드는 고급 언어로 작성될 수 있다. 본 개시물은 소프트웨어 컴파일러로서 구현될 수 있는 컴파일 기술 및 시스템/컴포넌트를 설명한다. 이를, 이하에서는, "블록체인 또는 비트코인 컴파일러(blockchain or Bitcoin compiler)"라고 할 수 있다. 소프트웨어 컴파일러는 비트코인 블록체인 또는 임의의 다른 블록체인 기반 프로토콜/네트워크와 함께 사용하도록 배열될 수 있다.
유리하게는, 본 개시물의 소프트웨어 컴파일러는 사용자(프로그래머)가 블록체인-실행 가능 프로그램/애플리케이션을 자신에게 친숙한 언어로, 예컨대, C, Java, C++ 신택스 스타일로 작성 및 생성하게 할 수 있다. 이로 인해, 보다 광범위한 개발 커뮤니티에 대하여 블록체인 기반의 개발 작업이 가능해진다. 이는 또한, 블록체인 기반의 해법이 보다 신속하게 작성될 수 있고, 아래에서 더 상세하게 논의되는 바와 같이 본 발명에 의해 에러가 검사될 수 있다는 것을 의미한다. 결정적으로, 기본 프로토콜 및 연계 스크립팅 언어의 보안 특징이 보존 및 유지된다. 따라서, 본 발명은 스크립트 생성 프로세스 동안 블록체인 관련 보안을 보존하기 위한 기술 및 시스템을 제공하고, 블록체인 네트워크 상의 노드들에 의해 유효성 검증되는 유효하고 에러 없는 스크립트(및 그에 따른 트랜잭션)의 생성을 용이하게 또는 가능하게 한다.
가능한 일 실시형태에 따르면, 소스 코드의 일부를 블록체인-호환 가능한 스크립트로 변환하기 위해 정적 컴파일(static compilation)을 사용하는 컴퓨터-구현 방법이 제공될 수 있다. 이는 컴파일러에 의해 제공되는 출력을 형성할 수 있다는 점에서 "출력 스크립트(output script)"라고 할 수도 있다. 본 발명은 하나 이상의 에러를 테스트할 수 있다. 하나 이상의 에러가 검출되면 경고를 제공할 수 있다. 정적 컴파일은 소스 코드의 일부 내에 제공되는 하나 이상의 루프가 언롤링될 수 있는 루프 언롤링(loop unrolling; 루프 풀기) 단계를 포함할 수 있다. "정적 컴파일" 및 "루프 언롤링"이라는 용어는 본 기술분야에 알려져 있고 당업자가 쉽게 이해할 수 있는 용어라는 점에 유의한다.
방법은 블록체인 네트워크와 함께 사용하도록 배열될 수 있다. 블록체인 네트워크는 프로토콜과 연계될 수 있다. 이는 "작업 증명(proof-of-work)" 블록체인일 수 있다. 이는 컨센서스 기반 블록체인일 수 있다. 이는 공공 및/또는 무허가 블록체인일 수 있다. 이는 피어-투-피어, 탈-중앙집중형 블록체인일 수 있다.
블록체인 네트워크는 블록체인 트랜잭션을 유효성 검증하는 복수의 노드를 포함하는 것일 수 있다. 블록체인 트랜잭션은 복수의 노드에 의해 실행될 수 있는 스크립트를 포함할 수 있다. 스크립트는 기능적으로 제한된(또는 비-튜링 완전성이라고도 하는) 블록체인 스크립팅 언어에 속하는 op_code 세트로 표현될 수 있거나, 또는 이를 포함할 수 있다. 방법은 블록체인 네트워크의 노드들에 의해 유효성 검증되는 블록체인 트랜잭션에 포함시키기 위한 출력 스크립트를 생성하는 단계를 포함할 수 있다. 출력 스크립트는 기능적으로 제한된 블록체인 스크립팅 언어에 속하는 op_code 세트로 표현될 수 있고, 출력 스크립트는 블록체인 네트워크의 노드들에 의한 스크립트의 실행이 소스 코드에서 지정되는 기능을 수행하도록 배열 또는 조정될 수 있다.
소스 코드의 일부는 고급 언어(HLL)로 작성될 수 있다. HLL은 컴파일 가능한 HLL로서 설명될 수 있다. HLL은 본 발명에 따라 배열되는 소프트웨어 컴포넌트(컴파일러)에 의해 컴파일될 수 있다. HLL은 인터프리터에 의해 실행될 수 있는 스크립트를 생성하도록 컴파일러에 의해 컴파일될 수 있다. 스크립트는 블록체인 트랜잭션(Tx)에 제공될 수 있다. 스크립트는 트랜잭션의 입력 또는 출력과 연계될 수 있다. HLL은 재귀, 복잡한 선택 구조 및/또는 루프와 같은 복잡한 제어 흐름을 구현하는 표현, 구문 및/또는 스테이트먼트를 허용할 수 있다는 점에서 튜링 완전성 언어(실세계 제약조건이 됨)일 수 있다. HLL에 대하여 고유한 신택스는 WHILE, FOR 또는 REPEAT 루프와 같은 루프-관련 신택스를 포함할 수 있다. 이는 암호화, 산술 및 스택-조작 연산의 수행을 위한 프리미티브를 포함할 수 있다. HLL은 실질적으로 후술하는 바와 같이, 사용자 정의 op_code 및/또는 고급 언어 구문을 포함할 수 있다.
블록체인 호환 스크립트는 블록체인 상에서 실행될 수 있는 블록체인 스크립팅 언어로부터 선택되거나, 그에 대하여 고유하거나, 및/또는 그 일부를 형성하는 op_code로 형성된 스크립트(즉, 프로그램)일 수 있다. op_code를 프리미티브 또는 명령이라고 할 수 있다. 스크립트는 블록체인 상에서 실행되기/실행 가능해지기 전에 인터프리터 또는 가상 기계(Virtual Machine)를 통과할 수 있다. (이러한 점에서 "블록체인"이라는 용어는 프로토콜 및 구현 플랫폼을 포함할 수 있음). 인터프리터는 스크립트를 기계-실행 가능 (목적) 코드로 변환할 수 있다. 블록체인 스크립팅 언어는, 예를 들어, 비트코인 프로토콜과 함께 사용되는 Script 언어 또는 그 변형일 수 있다. 스크립팅 언어는 블록체인 프로토콜과 함께 사용하도록 배열될 수 있다. 스크립팅 언어는 암호화, 산술 및 스택-조작 op_code를 포함할 수 있다.
블록체인 스크립팅 언어는 기능적으로 제한될 수 있다. 이는 신택스/인터프리터가 허용하도록 또는 취급하도록 배열된 기능에 대하여 제한될 수 있다. 이는 재귀, 복잡한 선택 구조 및/또는 루프와 같은 복잡한 제어 흐름을 기본적으로 지원하지 않을 수도 있다.
부가적으로 또는 대안으로서, 블록체인 플랫폼 상에서 고급 언어(HLL)로 작성되는 소스 코드의 일부의 실행을 가능하게 또는 용이하게 하도록 배열된 방법이 제공될 수 있다. 소스 코드는 스마트 계약(smart contract)을 구현하도록 배열될 수 있다. 스마트 계약은 본 기술분야에 알려져 있는 블록체인 상에서 실행 가능한 기계 판독 가능 및 실행 가능 애플리케이션일 수 있다.
방법은 소스 코드의 일부를 입력으로서 수신하는 단계를 포함할 수 있다. 이는 소프트웨어-구현 컴파일러에 의해 수신될 수 있다.
방법은 출력 스크립트를 생성하는 단계를 포함할 수 있다. 이는 전술한 바와 같이 블록체인 호환 스크립트일 수 있다. 이는 기능적으로 제한된 블록체인 스크립팅 언어로부터 선택되거나 및/또는 그에 대하여 고유한 복수의 op_code를 포함할 수 있다. 이 스크립팅 언어는 전술한 바와 같을 수 있다. 스크립트는, 실행시에, 적어도 부분적으로 소스 코드에서 지정되는 기능을 제공할 수 있다.
방법은 전술한 방법(들)의 임의의 실시형태를 수행하도록 배열되는 컴파일러를 제공 또는 사용하는 단계를 포함할 수 있다. 출력 스크립트는 정적 컴파일을 수행함으로써 생성될 수 있다.
정적 컴파일의 사용은 결과 스크립트가 항상 중단된다는 장점을 제공한다. 이는 실행 시간에 실질적인 장점을 제공할 뿐만 아니라, 소스 코드에서 몇 가지 유형의 에러 또는 무효한 구문이 발생했을 경우 블록체인 컴파일러가 정지할 것이기 때문에, 본 발명을 유효성 검증 도구로서 기능하게 할 수 있다. 스크립트 개발 동안 유효성 검증 도구를 사용할 수 있다는 장점은 프로그래머의 시간 및 노력을 줄임으로써 프로그래밍 작업이 개선된다는 것을 의미한다. 또한, 블록체인 컴파일러는 버그 및 오버플로우 에러를 테스트해서 프로그램의 실행 및 안전한 실행 여부를 사용자(프로그래머)가 정적으로 테스트할 수 있게 한다는 점에서 보안 해법을 제공한다.
블록체인 스크립팅 언어는 점프-기반 루프 또는 그 밖의 재귀 프로그래밍 구문을 통한 복잡한 제어 흐름 구문 또는 재귀를 기본적으로 지원하지 않도록 제한될 수 있다. 출력 스크립트를 생성하는 단계는 소스 코드에 제공되는 적어도 하나의 루핑 구문을 언롤링하는 단계를 포함할 수 있다. 방법은 출력 스크립트를 블록체인 플랫폼 상에서 실행 가능한 형태로 변환하도록 배열되는 인터프리터 또는 가상 기계를 제공 또는 사용하는 단계를 포함할 수 있다.
방법은 보다 효율적인 또는 감소된 버전의 출력 스크립트를 제공하도록 출력 스크립트를 적어도 한 번 최적화하는 단계를 더 포함할 수 있다. 이는 미분 없는 최적화(derivative free optimisation)(DFO)의 사용을 수반할 수 있다. DFO는 본 기술분야에 알려져 있고 당업자가 쉽게 이해할 수 있는 용어이다. 부가적으로 또는 대안으로서, 출력 스크립트를 생성하는 단계는 미분 없는 최적화의 사용을 포함할 수 있다.
블록체인 컴파일러는 소프트웨어 개발 키트(software development kit)(SDK)의 일부를 형성하거나, 및/또는 SDK와 함께 동작하도록 배열될 수 있다. SDK는 코드-기반 해법의 생성을 용이하게 하도록 SDK와 함께 사용되는 것으로 알려진 에디터, 디버거 및 그 밖의 컴포넌트(들)를 포함할 수 있다.
HLL은 블록체인 스크립팅 언어에 대하여 고유한 하나 이상의 프리미티브/명령/op_code로 직접적으로 변환될 수 있는 적어도 하나의 프리미티브, 연산자 또는 구문을 포함할 수 있다.
블록체인 스크립팅 언어는 스택-기반일 수 있다. 이는 하나의 또는 복수의 스택을 조작하도록 배열될 수 있다. HLL은 스크립팅 언어에 의해 사용되는 스택 상에서 연산의 수행을 야기하도록 배열되는 하나 이상의 프리미티브 또는 연산자를 포함할 수 있다.
HLL은 소스 코드에 대한 입력의 수를 블록체인 스크립팅 언어에 의해 메모리 할당에 사용되는 스택 상으로 푸시하도록 배열되는 프리미티브 또는 구문을 포함할 수 있다. HLL은 암호화 연산 또는 함수, 및 산술 연산, 및/또는 루프의 실행을 야기하도록 배열되는 하나 이상의 프리미티브를 포함할 수 있다.
HLL은 하기의 프리미티브들 또는 연산자들 또는 그들 각각의 기능적 등가물 중 적어도 하나를 포함할 수 있다:
Initiate;
Declare;
Increment;
IF;
While;
Populate;
Monus;
Reset;
Rawscript;
Abort;
Retrieve
Hash, 해시 160, 또는 다른 해시 연산자 또는 그 변형.
본 개시물은 소스 코드의 일부를 블록체인 호환 스크립트로 변환하기 위해 정적 컴파일을 사용하는 단계를 포함하는 방법을 제공할 수 있다. 정적 컴파일은 루프 언롤링 단계를 포함할 수 있다.
소스 코드의 일부는 적어도 하나의 고급 프로그래밍 구문을 포함할 수 있다. 출력 스크립트는 고급 프로그래밍 구문을 기능적으로 제한된 블록체인 스크립팅 언어에 속하는 하나 이상의 op_code로 변환함으로써 생성될 수 있다. 출력 스크립트의 하나 이상의 op_code는 블록체인 네트워크의 노드들에 의한 하나 이상의 op_code의 실행이 소스 코드의 적어도 하나의 고급 프로그래밍 구문(의 기능)을 수행하도록 배열 또는 조정될 수 있다.
바람직하게는, 기능적으로 제한된 블록체인 스크립팅 언어는 루프 구문을 지원하지 않는다. 바람직하게는, 적어도 하나의 고급 프로그래밍 구문은 루프 구문을 포함한다. 바람직하게는, 스크립트는 루프 구문("루핑 구문(looping construct)"이라고 할 수도 있음)을 언롤링함으로써 생성된다. 바람직하게는, 루프 구문은 코드의 블록 및 반복 횟수를 지정하는 인수를 포함하고, 루프 구문을 언롤링하는 것은 반복 횟수 동안 코드의 블록의 기능에 대하여 op_code를 작성하는 것을 수반한다.
방법은 루프 구문이 반복 횟수를 지정하는 인수를 포함하는 것 및 그러한 인수가 최대 반복 횟수를 지정하는 제약조건을 만족하는 것을 보장하도록 루프 구문의 신택스를 검사하는 단계를 더 포함할 수 있다.
루프 구문은 코드의 블록 및 적어도 하나의 변수에 기초하여 루프 구문의 반복 횟수를 지정하기 위한 조건을 포함할 수 있다. 바람직하게는, 루프 구문을 언롤링하는 것은 코드의 블록의 기능에 대하여 op_code를 복제하는 것과 함께, 출력 스크립트의 실행으로부터 결정되는 변수의 값을 사용한 조건의 평가에 기초하여 최대 반복 횟수 동안 코드의 블록의 기능에 대하여 복제된 op_code를 선택적으로 실행하는 op_code 명령을 작성하는 것을 수반한다.
본 개시물에 따르면, 본 명세서에서 설명되는 방법(들)의 임의의 실시형태의 단계들을 구현하도록 배열되는 컴퓨터-구현 시스템이 제공된다.
본 개시물의 실시형태에 따른 컴퓨터-구현 시스템은 컴파일러를 포함할 수 있다. 컴파일러는 소스 코드의 일부를 입력으로서 수신하도록 배열될 수 있다. 소스 코드는 고급 언어(HLL)로 작성될 수 있다. 컴파일러는 출력 스크립트를 생성하도록 배열될 수 있다. 출력 스크립트는 "블록체인 스크립트(blockchain script)" 또는 "블록체인 호환 스크립트(blockchain compatible script)"라고 인용될 수도 있으며, 복수의 op_code를 포함할 수 있다. 이들 op_code는, 실행시에, 스크립트가 적어도 부분적으로 소스 코드에서 지정되는 기능을 제공하도록, 전술한 바와 같이 기능적으로 제한된 블록체인 스크립팅 언어로부터 선택될 수 있거나, 및/또는 그에 대하여 고유할 수 있다.
시스템은 소프트웨어 개발 키트(SDK)를 포함할 수 있다. 컴파일러는 SDK의 일부를 형성할 수 있다.
또한, 본 발명은 시스템을 제공하고, 시스템은:
프로세서 및 메모리를 포함하고,
메모리는, 프로세서에 의한 실행의 결과로서, 시스템으로 하여금 본 명세서에서 설명되는 컴퓨터-구현 방법의 임의의 실시형태를 수행하게 하는 실행 가능 명령어를 포함한다.
본 발명은 또한, 컴퓨터 시스템의 프로세서에 의한 실행의 결과로서, 컴퓨터 시스템으로 하여금 적어도 본 명세서에서 설명되는 컴퓨터-구현 방법의 실시형태를 수행하게 하는 실행 가능 명령어를 저장하는 비일시적인 컴퓨터 판독 가능 저장 매체를 제공한다.
본 개시물의 하나의 양태 또는 실시형태와 관련하여 전술한 임의의 특징(들)은 하나 이상의 다른 양태들 또는 실시형태들에도 적용될 수 있다. 본 개시물의 방법과 관련하여 설명되는 임의의 양태는 본 개시물에 따라 시스템에 동일하게 적용될 수 있으며, 그 반대도 마찬가지이다.
본 개시물의 이들 및 다른 양태들은 본 명세서에서 설명되는 실시형태로부터 분명해지며 이를 참조하여 설명될 것이다. 이제, 본 개시물의 실시형태가 첨부 도면을 참조하여 단지 예시로서 설명될 것이다:
도 1은 본 발명의 개요를 도시한다.
도 2는 while 루프를 언롤링하기 위해 하기의 실시예와 관련하여 논의되는 바와 같이 Try[] 어레이 채우기를 위한 코드의 블록을 제공한다.
도 3은 다양한 실시형태가 구현될 수 있는 블록체인 환경을 도시한다.
도 4는 실시형태에 따른 이전(previous) 블록체인 트랜잭션을 참조하는 소비(spending) 블록체인 트랜잭션을 유효성 검증 및 채굴하기 위한 블록체인 프로토콜을 도시한다.
도 5는 다양한 실시형태가 구현될 수 있는 컴퓨팅 환경을 도시한다.
개요
이하에서는, 가장 널리 알려져 있고 채택되고 있기 때문에, 단지 참조의 편의상 비트코인 프로토콜, 블록체인, 네트워크 또는 스크립팅 언어를 참조한다. 그러나, 본 발명은 비트코인-관련 블록체인과 함께 사용하도록 제한되지 않으며, 다른 블록체인 기술들도 본 개시물의 범위 내에 속한다.
전술한 바와 같이, 오늘날 대부분의 프로그래머는 저급 언어가 아닌 C, C++, Java 등과 같은 고급 언어(High Level Languages)로 코드를 작성한다. 더 저급 언어로 코드를 작성할수록, 시간이 더 걸리고, 메모리 조작에 관한 더욱 전문적인 지식이 필요해지고, 결과적으로 에러가 발생할 수 있다. 따라서, 근본적인 제한된 스크립팅 언어에 의해 제공되는 보안을 훼손하지 않으면서, 프로그래머가 자신에게 더욱 친숙한 언어로 블록체인 애플리케이션에 대한 유효하고, 테스트되고, 에러-검사된 코드를 작성할 수 있는 것이 유리하다.
본 개시물에서 설명되는 바와 같은 방법 및 시스템은 전문적인 블록체인 트랜잭션들 또는 트랜잭션들의 클러스터를 생성하기 위한 'SDK'의 개발을 가능하게 한다. 예를 들어, 트랜잭션은 기계 실행 가능 스마트 계약의 조건을 자동으로 집행하도록 의도될 수 있지만, 많은 다른 애플리케이션들이 가능하며 본 발명은 이와 관련하여 제한되지 않는다. 따라서, 본 발명은 블록체인-관련 기술을 생성 및 테스트하기 위한 "툴키트(toolkit)" 또는 시스템의 일부를 형성할 수 있다.
유리하게는, 블록체인 컴파일러는 사용자의 소스 코드의 정적 컴파일을 수행하고, 루프 언롤링과 같은 기술의 사용을 통해 복잡한 제어 흐름 메커니즘의 구현을 가능하게 한다. 본 기술분야에 알려져 있는 바와 같이, "루프 언롤링(loop unrolling)"을 "루프 풀기(loop unwinding)"라고 할 수도 있다. 루프 언롤링은 특정 유형의 루프에서 브랜치의 빈도를 줄이거나, 및/또는 루프 유지보수 명령을 줄이기 위해 컴파일러에 의해 사용될 수 있는 루프 변환 기술이다. 소스 코드에서 발견되는 루프를 언롤링함으로써, 컴파일러는 기능적으로 제한된 스크립트 언어를 사용하는 블록체인 플랫폼 상에서 실행될 수 있는 변환된 버전의 소스 코드를 생성할 수 있다.
도 1을 참조하면, 본 개시물의 실시형태는 사용자(프로그래머)가 고급 언어(HLL)를 사용해서 원하는 애플리케이션, 예컨대 스마트 계약에 대한 코드(101)를 정의할 수 있게 하고, 이후, HLL 코드(101)를 실행 파일에 컴파일하는 블록체인 컴파일러(102)를 실행할 수 있게 한다. 이러한 실행 파일은 보트(bot)에 의해 실행될 수 있는 3G 언어 프로그램(예를 들면, 파이선(python), C++ 등)의 청크(chunk) 형태로 될 수 있거나, 또는 (예컨대, 비트코인) 스크립트(103)의 청크 형태로 될 수도 있다. 후자는 특정한 기능을 수행할 수 있는 스크립트의 청크를 설계 및 생성하는 것에 의해 달성된다. 예를 들어, 비트코인 스크립트의 원래의 버전에는 OP_MUL이라고 하는 곱셈 함수가 포함된다. 이 op_code는 현재 비활성화되어 있다. 그러나, 동일한 기능이 스크립트의 일부에서 기존의 활성화된 op_code를 사용해서 재현될 수 있다.
본 개시물의 실시형태들은 하기의 2가지 유형의 프리미티브 중 하나 또는 둘 모두를 포함할 수 있다:
· 사용자 정의 op_code(이하에서는 COP_CODE라고 함); 및
· 고급 언어(HLL) 구문
HLL 구문은 이들을 스크립트 코드(103)로 변환하기 위해 컴파일러(102)를 필요로 하지만, COP_CODE는 COP_CODE로부터 OP_CODE의 블록으로의 직접적인 치환만을 필요로 한다. 통상적으로, 프리미티브는, 임의의 변수에 액세스할 필요가 없을 경우, 즉, 주어진 프로토콜(및 다른 COP_CODE) 및 하드-코딩된 입력에 대하여 블록체인 스크립팅 언어에 이미 존재하는 OP_CODE만을 사용해서 완전히 설명될 수 있을 경우, COP_CODE로 만들어진다.
예를 들어, monus 프리미티브는 op_code로 충분히 설명될 수 있으므로, 다음과 같이, COP_CODE로 만들어질 수 있다:
OP_SUB
OP_0
OP_MAX
그러나, WHILE 루프의 실행은 필요한 변수(예를 들어, 실행 조건; 반복 횟수에 대한 카운터 등)에 따라 다르다. 그러므로, WHILE은 COP_CODE로 만들어지기에는 부적합하며, HLL 구문으로 작성된다.
유리하게는, 2가지 유형의 프리미티브를 포함하면, 프로그래머에게 추가적인 융통성이 제공된다. 직접 비트코인 스크립트로 프로그램을 작성하는(즉, HLL을 사용하지 않음) 프로그래머는 COP_CODE를 통해 개선된 스크립트 기능을 사용할 수 있게 된다. 실제로, 이는 스크립트 프로그래머에게 필요한 기능을 수행할 OP_CODE의 블록에 대한 치환을 제공하여, 프로그래밍 시간 및 노력을 삭감한다. 필요한 것은 COP_CODE를 그것을 대체할 OP_CODE의 블록으로 간단히 치환하는 'COP_CODE 컴파일러'이다. 저급 비트코인 스크립트로 프로그램을 작성할 수 없는, 또는 작성하고 싶어하지 않는 프로그래머는 본 개시물에 의해 지원되는 HLL을 대신 사용할 수 있다.
사용자 정의 OP_CODE(COP_Code)는 아래에서 더 논의된다.
1. 사용자 정의 OP_CODE(COP_CODE)
이 섹션은 사용자 정의 OP_CODE(COP_CODE)에 대한 스크립트 프리미티브와 관련하여 이하에서 본 개시물에 따라 적용될 수 있는 표준을 설명한다. COP_CODE는 일반 op_code와 유사한 포맷으로 제공되며 동일한 방식으로 동작한다. 즉, Script(및/또는 컴파일러)의 작성자는 종래에 op_code를 사용하는 것과 동일한 방식으로 프리미티브를 사용한다. 비트코인 op_code의 리스트는 비트코인 위키(Bitcoin wiki): https://en.bitcoin.it/wiki/Script에서 확인할 수 있다.
명명 규칙
스크립트 프리미티브는 본 명세서에서 다음과 같이, Bitcoin Script op_code와 유사하게 명명된다:
COP_xxx
여기서, 'xxx'는 함수의 약어이다. 예를 들어, 곱셈 함수는 COP_MULT로 명명될 수 있다. 또한, op_code와 유사하게, 함수가 특정 수의 파라미터 또는 계산에 사용되는 특정 숫자를 가지면, 이름에 해당 숫자가 포함될 수 있다. 예를 들면, op_code 'OP_2DROP'은 '상위 2개의 스택 항목을 제거한다'를 의미하는 반면, 'OP_1ADD'는 '1이 입력에 추가된다'를 의미한다. 따라서, COP_2MULT는 구체적으로 '입력에 2가 곱해진다'를 의미할 수 있다.
실행 전 유효성 검증
특정 수의 입력 또는 입력 포맷이 예상되는 경우, 프리미티브는 기능적 논리를 실행하기 전에 검사를 수행하고, 입력이 예상치와 매칭되지 않으면 중단한다(트랜잭션을 무효한 것으로 표시함). 유리하게는, 이는 함수가 부정확하거나 오도될 수 있는 출력을 실행 및 제공하는 것을 방지한다. 예를 들어, 특정 프리미티브가 양수인 입력에 대해서만 동작하도록 되어 있지만, 그럼에도 불구하고 음수에 대해서도 에러 없이 실행되면, 결과는 '유효한 트랜잭션'이 되겠지만, 예상 밖의 또는 부정확한 결과일 수 있다.
2. 고급 언어(HLL) 구문
이는 본 개시물에 따라 범위가 정해지는 컴파일러가 인식할 수 있고 비트코인 스크립트로 변환할 수 있는 함수 또는 스테이트먼트이다. 전부 고려하면, 이는 프로그래머에게 친숙한 신택스를 사용해서 고급 프로그래밍 언어를 구성한다. 친숙한 구문(예를 들면, IF-ELSE; CASE; WHILE 루프 등) 뿐만 아니라, 비트코인 트랜잭션 작업 방식 때문에 HLL에 대하여 매우 특정된 친숙하지 않은 구문도 있다. 예를 들어, INITIATE 구문은 메인 스택에 자동으로 푸시되는 데이터 입력의 수가 메모리 할당의 제1 상수(예약어 NUM_INPUTS에 할당됨)로서 저장되도록 하는 매우 특정한 기능을 수행한다. 실시형태들에 있어서, INITIATE 구문은 HLL 프로그램에서 제1 스테이트먼트일 수 있고, DECLARE 구문(상수 및 변수에 대한 메모리 할당을 수행함)은 HLL 프로그램에서 제2 스테이트먼트일 수 있다.
HLL 구문은 컴파일시에 이용 가능한 정보만을 사용해서 컴파일러에 의해 비트코인 스크립트로(즉, OP_CODE 및 COP_CODE로) 변환될 수 있도록 하는 방식으로 설계되어야 한다. 이는 일반적으로 프로그램에서 상수가 DECLARE된 및 할당된 값인, 프로그래머에 의한 많은 하드-코딩을 의미한다. 예를 들어, NUM_INPUTS이 상수로 간주되더라도, 프로그램이 실행될 때까지는 컴파일러가 그 값에 액세스할 수 없으므로, 이는 컴파일 실행에 사용될 수 없다(물론, 프로그래머는 그것을 프로그램에서 임의의 다른 상수처럼 사용할 수 있음).
HLL 구문을 설계할 때, 설계자는 컴파일러의 예상 연산을 의사 코드로 또는 자연 언어에 의한 명확한 설명으로 포함할 수 있다. 예를 들어, 컴파일러는 정확한 신택스 및 임의의 제약조건(예를 들면, 사이즈 제한)의 준수의 검증과 같은 특정한 검사를 수행해야 할 수 있다. 이는 특정 제약조건을 아직 모르더라도 명시적이어야 한다. HLL 구문을 설계하는 작업은 컴파일러 자체를 작성하는 것을 포함하는 것이 아니라, 컴파일러의 모든 예상 연산을 가능하게 해야만 한다.
본 개시물의 예시적인 실시형태에 따라 사용될 수 있는 HLL 구문의 선택이 이제 제공된다.
HLL 구문: While 루프
설명
코드의 블록(또는 통상적으로 루프 본문이라고도 하는 코드-블록)은 지정된 조건이 최대 반복 횟수까지 참(True)을 유지하는 한 반복적으로 실행된다. 최대 반복 횟수는 기지의 값이어야 하고 컴파일시에 지정되어야 한다. 루프는 '루프의 언롤링(unrolling the loop)'으로서 알려진 기술에 의해 모방된다. 이는 코드-블록의 기능(연산 시퀀스)을 나타내는 op_code 시퀀스가 지정된 최대 반복 횟수로 복제됨을 의미한다. 코드-블록에 대한 각각의 복제된 op_code 시퀀스 이전의 IF 스테이트먼트는 코드-블록에 대한 op_code 시퀀스가 실행되는지의 여부를 결정한다. IF 조건은 루프의 시작시에(즉, 코드-블록에 대한 op_code 시퀀스의 첫 번째 실행 이전에) 검사된다.
신택스:
WHILE (Iterations, Condition)
<CODE-BLOCK>
END_WHILE
여기서:
Iterations(반복):
양의 정수
코드-블록이 실행될 수 있는 최대 횟수. 컴파일러는 코드-블록을 여러 차례 생성할 것이기 때문에 이 값을 알아야 한다. 하드-코딩될 수 있거나, 또는 DECLARE 스테이트먼트에 있는 상수를 참조할 수 있다.
Condition(조건):
TRUE 또는 FALSE로 푸는 평가 가능한 표현식
복합 조건일 수 있음, 즉, AND, OR 등을 사용(현재 컴파일러에 의해 인식되는 것)
컴파일러 연산:
신택스 검사를 수행한다.
반복이 임의의 제약조건을 만족하는지(예컨대, 미리 정해진 범위 내에 속하는지)를 검사한다
조건에서의 표현식(들)이 평가 가능한지를 검사한다:
표현식의 모든 상수/변수가 메모리 할당(DECLARE) 리스트에 존재한다
표현식에서 사용되는 모든 연산자가 현재 허용되는지(=, <, > 등)를 검사한다
복합 표현식이 임의의 제약조건(예컨대, 제한된 AND, OR 등)을 만족하는지를 검사한다
코드-블록의 기능 '반복' 횟수를 복제한다:
START OF REPLICATED CODE(복제된 코드의 시작)
조건(즉, 실행으로 스택의 상위에 TRUE 또는 FALSE가 남는다)을 푸는 하나 이상의 op_code를 작성한다:
일반적인 프로세스는 테스트에 필요한 각각의 값을 불러와서 메인 스택의 상위에 배치하는 RETRIEVE 구문을 채택하고 나서, 관련 테스트 연산(즉, OP_EQUAL; OP_LESSTHAN; OP_GREATERTHAN 등)을 수행할 수 있다. 테스트될 값이 상수이면, 할당된 메모리 내의 기지의 장소(즉, 메인 스택 상의 기지의 위치)에 있을 것이고, OP_PICK을 사용해서 스택의 상위에 복사될 것이다. 테스트될 값이 변수(이 경우, 테스트될 값은 스크립트 실행 동안 결정됨)이면, 변수의 장소는 할당된 메모리 내의 기지의 장소(즉, 대체 스택(alt stack) 상의 기지의 위치)에 있을 것이고, "Borrow Block(블록 차용)" 방법을 사용해서 메인 스택의 상위에 복사될 수 있다.
테스트가 복합 조건(AND, OR 등을 사용)을 채택하면, 각각의 하위 조건이 별도로 평가되고 최종 결과(0 또는 1)는 메인 스택의 상위에 남는다. 이후, 이들은 복합 조건을 테스트하기 위해 조합된다. 예를 들어, 복합 조건이 'Exp1 OR Exp2' 형식으로 이루어지면: 연산은 먼저 Exp1을 평가하고 나서 Exp2를 평가하고, 이후 스택 상의 상위 2개의 값(즉, Exp1 및 Exp2에 대한 평가 결과)을 비교하게 되는 OP_BOOLOR을 작성한다.
평가의 결과는 메인 스택의 상위에 남는다. 스택 상에 다른 값들은 없다(물론 할당된 메모리에 대한 것은 예외). 값은 다음 연산(OP_IF)에 의해 소비될 것이다.
코드-블록의 기능(연산 시퀀스)을 코드-블록의 기능을 나타내는 op_code 시퀀스로 변환한다. 이러한 변환은 코드-블록에 포함되는 임의의 COP_CODE에 대하여 바이패스될 수 있으며, 이는 COP_CODE의, 코드-블록에 대한 op_code 시퀀스로의 직접적인 치환만을 필요로 한다. 이후, OP_IF/OP_ENDIF 쌍 내의 코드-블록의 기능을 나타내는 op_code 시퀀스를 작성한다
END OF REPLICATED CODE(복제된 코드의 종료)
일부 실시형태에 있어서, 복제된 코드-블록을 나타내는 op_code 시퀀스는 WHILE 루프 구문의 각각의 반복에 대한 op_code 시퀀스에 의해 액세스된 상수 및 변수에 대한 초기 스택 위치들이 루프 반복에 걸쳐 일정하도록 구성될 수 있다. 변수(들)의 값(들)은 루프 반복에 걸쳐 업데이트될 수 있지만, 각각의 루프 반복의 실행을 시작할 때 이러한 상수 및 변수에 대한 스택 위치들은 루프 반복에 걸쳐 일정하게 유지될 것이라는 점에 유의한다. 이러한 연산은 복제된 op_code 시퀀스가 각각의 루프 반복 동안 스택 상에 저장되는 적절한 상수 및/또는 변수에 액세스하는 것을 보장한다.
일부 실시형태에 있어서, 코드-블록을 복제하는 조건은 스크립트 실행 동안 결정된 하나 이상의 변수의 값에 의존할 수 있고, 그에 따라 루프 반복에 걸쳐 업데이트될 수 있다. 이 경우, 복제된 코드-블록의 각각의 반복은 OP_IF/OP_ENDIF 쌍에 내재되는 복제된 코드-블록을 나타내는 op_code 시퀀스를 관련 조건에 이어서 테스트하는 하나 이상의 op_code 명령을 포함할 수 있다. 이 구성에 있어서, 스크립트의 실행 동안, 관련 조건을 테스트하는 op_code 명령은 TRUE 또는 FALSE로서 평가하고 TRUE 또는 FALSE 결과를 스택의 상위에 배치하게 된다. 후속 OP_IF 스테이트먼트의 실행은 TRUE 결과가 스택의 상위에 있을 경우에만 복제된 코드-블록을 선택적으로 실행할 것이다. 따라서, FALSE 결과가 스택의 상위에 있을 경우에는, OP_IF 스테이트먼트의 실행은 복제된 코드-블록의 실행을 바이패스한다.
또한, 코드-블록을 복제하기 위한 조건은 WHILE 루프 구문에서 지정되는 파라미터, 시스템 설계에 의해 고정되는 파라미터 또는 일부 다른 파라미터에 의해 정의될 수 있는 최대 반복 횟수에 의해 제한될 수 있다. 이 경우, 조건 및 OP_IF/OP_ENDIF 쌍에 내재되는 복제된 코드-블록을 나타내는 후속 op_code 시퀀스를 테스트하는 op_code 명령은 파라미터-정의된 최대 반복 횟수에 대응하는 횟수로 복제될 수 있다.
또한, HLL 프로그램은 내부 WHILE 루프 구문이 외부 WHILE 루프 구문의 코드-블록 내에 포함되는 내포형 WHILE 루프 구문을 채택할 수 있다는 점에 유의한다. 이 경우, 컴파일러는 내부 WHILE 루프 구문에 대한 루프 언롤링을 외부 WHILE 루프 구문에 대한 루프 언롤링과 함께 수행할 수 있다. 예를 들어, 내부 WHILE 루프 구문의 루프 언롤링은 내부 WHILE 루프 구문의 반복 횟수 동안 OP_IF/OP_ENDIF 바이트코드 명령어 쌍 사이의 내부 WHILE 루프 구문의 코드-블록의 기능을 나타내는 op_code 시퀀스를 복제할 수 있다. 또한, 외부 WHILE 루프 구문의 루프 언롤링은 외부 WHILE 루프 구문의 반복 횟수 동안 OP_IF/OP_ENDIF 바이트코드 명령어 쌍 사이의 외부 WHILE 루프 구문의 코드-블록의 기능을 나타내는 op_code 시퀀스를 복제할 수 있다. 이 경우, 외부 WHILE 루프 구문의 각각의 반복에 대한 코드-블록의 기능을 나타내는 op_code 시퀀스는 내부 WHILE 루프 구문의 반복 횟수에 대한 op_code 시퀀스를 포함할 것이다.
또한, WHILE 루프 내포는 부가적인 내부 WHILE 루프 구문이 내부(제1 내부) WHILE 루프 구문의 코드-블록 내에 포함되고 추가적인 내포가 가능할 경우에 확장될 수 있다는 점에 유의한다. 이 경우, 본 명세서에서 설명되는 바와 같은 루프 언롤링 연산은 이 추가적인 내포를 해결하도록 용이하게 확장될 수 있다.
HLL 구문: INITIATE
설명:
실시형태들에 있어서, 이는 임의의 HLL 프로그램의 필수적인 제1 스테이트먼트이다.
트랜잭션 소비자에 의해 공급되는 스크립트 실행의 제1 부분(즉, 'scriptsig')은 잠금 해제 스크립트의 제어를 벗어난다. 이는 스택에 푸시될 데이터로 구성되는 것이 일반적이다. INITIATE 구문의 목적은 프로그래머가 이 입력(대부분의 경우, 해당 스크립트의 나머지 부분에 대하여 필요한지의 여부)을 관리할 수 있게 하기 위한 것이다.
이 구문은 예약어 NUM_INPUTS에 '값을 할당(allocates a value)'한다(스택에 푸시되는 소비자-제공 입력에서 항목의 수임). 제1 OP_CODE는 항상 OP_DEPTH이므로, (이 시점에) 스택의 상위에는 스택에 푸시된 데이터 입력의 수가 포함된다. 스택에서의 이 위치는 고정되고 컴파일 시에 컴파일러에 알려지지만, 실제 값은 컴파일 시에 알려지지 않는다.
신택스:
INITIATE
컴파일러 연산:
OP_DEPTH를 작성한다(Write OP_DEPTH) /* 이는 OP_DEPTH를 NUM_INPUTS의 값으로 설정한다.
HLL 구문: DECLARE
설명:
실시형태들에 있어서, 이는 임의의 HLL 프로그램의 필수적인 제2 구문이다.
컴파일러가 '메모리 스토리지(memory storage)'(즉, 메인 스택 및/또는 대체 스택에서의 위치)를 예약할 수 있도록 모든 상수 및 변수를 선언한다. 표준은 메인 스택에 상수를, 그리고 대체 스택에 변수를 유지하는 것이다. 컴파일러는 변수 및 상수에 주어진 이름을 스택 상의 그들의 위치에 연계시킨다. 컴파일러는 명명된 항목들을 이미 소비자에 의해 제공되는 데이터 입력을 포함하는 메인 스택 상에(INITIATE 참조), 그리고 해당 데이터 항목들의 수를 나타내는 값(예약어 NUM_INPUTS과 연계됨)을 그 상위에 푸시한다.
신택스:
DECLARE
CONSTNATS
Const-name = Initial-value
Array-nameA[array-size] = Initial value (if same for all elements)
Array-nameB[1] = initial value for element 1
Array-nameB[2] = initial value for element 2
...
Array-nameB[n] = initial value for element n
VARIABLES
Var-name = Initial-value
Array-nameC[array-size] = Initial value (if same for all elements)
Array-nameD[1] = initial value for element 1
Array-nameD[2] = initial value for element 2
...
Array-nameD[n] = initial value for element n
END_DECLARE
컴파일러 연산:
PUSHDATA 명령을 작성해서 HLL 프로그램의 DECLARE된 상수 값을 메모리 스토리지(예를 들면, 메인 스택)에 넣는다. 명령은 상위에서 시작할 수 있고 항목들을 메모리 스토리지에 하나씩 푸시할 수 있다. 컴파일러는 메모리 스토리지 내의 각각의 상수 값의 장소(예컨대, 메인 스택 위치)를 추적할 수 있다. OP_TOALTSTACK 명령을 작성해서 HLL 프로그램의 변수를 메모리 스토리지(예를 들면, 대체 스택)에 넣는다. 다시, 컴파일러는 메모리 스토리지 내의 각각의 변수의 장소(예컨대, 대체 스택 위치)를 추적할 수 있다.
실시예:
DECLARE
CONSTNATS
Stock [5] = 0 /* 12개의 값의 어레이가 모두 0으로 초기화된다
Stock_Needed = 3 /* 규칙에 대하여 하드-코딩된다
NUM_Hashes = 4 /* 규칙에 대하여 하드-코딩된다
/* 10개의 해시 값의 어레이가 하드코딩된다:
HASH_SAVED[1] = 20-byte hash value
HASH_SAVED[2] = 20-byte hash value
HASH_SAVED[3] = 20-byte hash value
HASH_SAVED[4] = 20-byte hash value
VARIABLES
Stock_counter = 0
Try_counter = 0
Hash_Counter = 0
Match_Found = FALSE
이들 스테이트먼트의 컴파일러 실행을 따르면(또한, 필수적인 INITIATE 스테이트먼트가 일부 값을 선택한다고 가정하면), 메모리 스토리지(이 경우에는, 메인 스택 및 대체 스택)의 상태는 다음과 같을 것이다:
Figure pct00001
이 실시예에 있어서는, 잠금 해제 스크립트에 공급되는 몇 개의 입력 항목들이 존재한다고 가정한다. 최소한, 해당 값이 0이고 스택 상에서 그 아래에 값이 없다고 해도, 'NUM_INPUTS'(이것은 예약어임)으로 표시된 위치에는 값이 존재한다. 이 값은 그 아래에 얼마나 많은 항목이 있는지에 관계없이 메모리 블록의 시작으로서 간주된다. 컴파일러는 메모리 내의 항목의 수 및 스택의 상위로부터 그들의 초기 상대 위치를 알고 있다. 이들 항목은 프로그램 실행의 기간 동안 제위치에 유지된다. 스택의 상위에 있는 공간(다이어그램에서는 '(for temp variables)'로 도시됨)을 사용해서 임시 계산이 행해진다. 항목들이 계산을 위해 메인 스택의 상위에 임시로 푸시되면, 메모리 항목들의 상대 위치가 변경된다. 그러나, 컴파일러는 항상 상대 위치에 대한 지식을 보유한다.
예를 들어, DECLARE 스테이트먼트가 실행된 후에, 컴파일러는 초기 깊이(Init-depth)에 대한 값(이 실시예에서는 Init-depth = 12) 및 스택에서의 각 항목에 대한 깊이 위치를 연산해서 내부에 보유한다. 즉:
Init-Depth-Num_Hashes = 5
Init-Depth-NUM_INPUTS = 12
Init-Depth-Stock[i] = 11 - i + 1
컴파일러는 <item's initial depth(항목의 초기 깊이)> + <number of items added onto the stack(스택 상에 추가된 항목의 수)>에 기초한 컴파일 동안 임의의 시점에 임의의 항목의 깊이를 계산할 수 있다.
HLL 구문: INCREMENT
설명:
변수는 메모리 내의 그 장소로부터 검색되고; 1씩 증분되고 나서; 메모리 내의 그 장소에서 대체된다.
신택스:
INCREMENT (Variable-name)
여기서:
Variable-name(변수-이름):
변수를 식별하기 위해 선언(Declaration) 섹션에서 사용되는 이름.
컴파일러 연산:
주: 컴파일러는 양 스택 상의 변하는 항목 수에 대한 지식(말하자면: Main_Stack_Height 및 ALT_Stack_Height)을 유지한다. 또한, 컴파일러는 선언 섹션 동안 설정된 각각의 스택 상의 각각의 변수 및 상수의 위치도 알고 있다. 즉, Var-Posn = 대체 스택에서의 Variable-name의 위치(즉, 스택의 하위로부터의 항목의 수)이다.
연산은 블록 차용(Borrow Block) 기술을 사용한다.
Var-Depth = ALT_Stack_Height - Var-Posn + 1을 계산한다(Calculate Var-Depth = ALT_Stack_Height - Var-Posn + 1)
OP_FROMALTSTACK을 Var-depth 회 작성한다(Write OP_FROMALTSTACK Var-depth times) /* 필요한 변수를 메인 스택의 상위로 가져온다
OP_ADD1을 작성한다(Write OP_ADD1) /* 값을 1씩 증분한다
OP_TOALTSTACK을 Var-depth 회 작성한다(Write OP_TOALTSTACK Var-depth times) /* 차용한 변수를 모두 대체 스택으로 대체한다
(블록 차용(Borrow Block) 설명에서 실시예 2를 참조).
실시예: 변수 B 증분
Figure pct00002
작업은 변수 B를 증분하는 것이다. 컴파일러는 대체 스택에서 B의 깊이가 B-Depth = 5임을 알고 있다. 컴파일러는 하기의 스크립트 코드를 생성한다:
OP_FROMALTSTACK /* 대체 스택의 상위를 메인 스택으로 5회 이동시킨다(즉, B_Depth 횟수)
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK
Figure pct00003
OP_ADD1 /* 메인 스택의 상위의 값을 1씩 증분한다
Figure pct00004
TO-ALTSTACK /* 변수를 대체 스택으로 반환한다
TO-ALTSTACK /* 즉, TO_ALTSTACK을 B-Depth 회 수행한다
TO-ALTSTACK
TO-ALTSTACK
TO-ALTSTACK
Figure pct00005
HLL 구문: IF ELSE
설명:
표준 IF 테스트
신택스:
IF Value1 test-operation Value2
TRUE-CODE-BLOCK
ELSE
FALSE-CODE-BLOCK
END_IF
여기서:
Value1(값1) 하드코딩된 값 또는 변수 이름 또는 상수 이름
Value2(값2) 하드코딩된 값 또는 변수 이름 또는 상수 이름
Test-operation(테스트-연산) '='; '<'; '>'; '≤'; '≥' (등)과 같은 수학적 테스트 연산자
컴파일러 연산:
신택스를 검사한다. 다음을 포함한다:
테스트-연산을 균등한 OP_CODE(내부 테이블)와 매칭시킨다:(Match test-operation to equivalent OP_CODE (internal table):)
= OP_EQUAL
> OP_GREATERTHAN
< OP_LESSTHAN
(등)
값1이 변수 또는 상수인 경우:(If Value1 is a variable or constant:)
RETRIEVE Value1을 작성한다(Write RETRIEVE Value1) /* 스택의 상위에 값1을 남긴다
그렇지 않으면(숫자임)(Else (it's a number))
스택의 상위에 값1을 푸시한다(Push Value1 top of stack)
값2가 변수 또는 상수인 경우:(If Value2 is a variable or constant:)
RETRIEVE 값2를 작성한다(Write RETRIEVE Value2) /* 스택의 상위에 값2를 남긴다
그렇지 않으면(숫자임)(Else (it's a number))
스택의 상위에 값2를 푸시한다(Push Value2 top of stack)
다음을 작성한다:
OP_IF
TRUE-CODE-BLOCK /* 테스트 결과가 TRUE일 경우 실행할 코드-블록
OP_ELSE
FALSE-CODE-BLOCK /* 테스트 결과가 FALSE일 경우 실행할 코드-블록
OP_ENDIF
HLL 구문: RESET
설명:
변수에 지정된 값이 할당된다.
신택스:
RESET (Variable-name, Reset-value)
여기서:
Variable-name(변수-이름) 새로운 값이 할당될 변수의 이름
Reset-value(재설정-값) 변수-이름에 할당될 값
컴파일러 연산:
주: 컴파일러는 양 스택 상의 변하는 항목 수에 대한 지식(말하자면: Main_Stack_Height 및 ALT_Stack_Height)을 유지한다. 또한, 컴파일러는 DECLARE 섹션 동안 설정된 할당된 메모리 내의(즉, 각각의 스택 상의) 각각의 변수 및 상수의 위치도 알고 있다.
Var-Posn = 대체 스택에서의 Variable-name의 위치라고 가정한다(Assume Var-Posn = the position of Variable-name in the alt stack)(즉, 스택의 하위로부터의 항목의 수). 연산은 블록 차용(Borrow Block) 기술을 사용한다:
Var-Depth = <current ALT_Stack_Height> - Var-Posn + 1을 계산한다(Calculate Var-Depth = <current ALT_Stack_Height> - Var-Posn + 1)
OP_FROMALTSTACK을 Var-depth 회 작성한다(Write OP_FROMALTSTACK Var-depth times) /* 필요한 변수를 메인 스택의 상위로 가져온다
OP_DROP 재설정-값을 작성한다(Write OP_DROP Reset-value) /* 이전 값을 삭제하고; 필요한 값으로 대체한다
OP_TOALTSTACK을 Var-depth 회 작성한다(Write OP_TOALTSTACK Var-depth times) /* 차용한 변수를 모두 대체 스택으로 대체한다
HLL 구문: ABORT
설명:
트랜잭션을 무효한 것으로 표시한다
신택스:
ABORT
컴파일러 연산:
OP_0 OP_VERIFY를 작성한다(Write OP_0 OP_VERIFY)
HLL 구문: POPULATE
설명:
이 구문의 목적은 트랜잭션 소비자로부터의 입력(예를 들면, 소비 트랜잭션의 잠금 해제 스크립트의 실행에 의해 공급되는 입력)을 사용해서 프로그래머에 의해 DECLARE된 상수를 채우기 위한 것이다.
잠금 스크립트로의 입력(즉, 'scriptsig')은 임의의 데이터를 메인 스택 상으로 푸시한다. 이는 DECLARE 구문 이전에 발생하므로, 이들 입력은 스택의 하위에 있다. 스택 항목의 수(NUM_INPUTS)는 (필수적인) INITIATE 스테이트먼트에 의해 그들의 상위로 배치되었다. 트랜잭션의 규칙이 충족되었는지(예컨대, 올바른 수의 입력이 제공되었는지)를 검증하는 것은 프로그래머의 책임이다.
신택스:
POPULATE (Stack-position, Constant-name)
여기서:
Stack-position(스택-위치):
정수. 메모리 블록의 하위로부터 아래쪽으로 카운트되는 위치. 메모리 블록의 하위는 항상 항목 NUM_INPUTS을 포함하고, 이 아래에 있는 것은 잠금 스크립트 코드가 실행되기 전에 스택 상으로 푸시되는 입력 데이터임을 명심한다.
Constant-name(상수-이름):
채워질 상수의 이름.
컴파일러 연산:
시프트-카운트를 계산 = 안전한 보관을 위해 메인 스택에서 대체 스택 상으로 임시로 이동될 스택 항목의 수:(Calculate shift-count = number of stack items to be temporarily moved off the main stack onto the alt stack for safekeeping:)
시프트-카운트 = 목표 항목의 상위에 있는 스택 항목의 수(Constant-name)(Shift-count = Number of stack items on top of the target item (Constant-name))
입력-깊이 = <상수-이름의 상대 높이> + 스택 위치를 계산한다(Calculate the Input-depth = <relative height of Constant-name> + stack-position)
다음을 작성한다:
OP_TOALTSTACK (이 시프트-카운트 횟수를 복제한다)
OP_DROP /* 상수-이름(아마도 0으로 설정됨)의 현재 값을 폐기한다
< Input-depth > OP_PICK /* 필요한 값을 취해서 상수-이름 위치에 배치한다
OP_FROMALTSTACK (이 시프트-카운트 횟수를 복제한다)
HLL 구문: RAWSCRIPT
설명:
비트코인 스크립트 코드의 유효한 청크를 나타내는 값들의 어레이. 컴파일러는 먼저 어레이가 스크립트 코드의 유효한 청크(OP_CODE, COP_CODE 및 정수를 포함)인지 확인하기 위해 어레이를 유효성 검증한다. 목적은 프로그래머가 저급 코드를 컴파일러 출력에 직접적으로 포함시킬 수 있게 하는 것이다. 이는 현재 이용 가능한 HLL 구문을 사용하는 것보다 스크립트 코드에 직접적으로 코딩하는 것이 여전히 더욱 용이한 임의의 기능에 대하여 유용하다.
신택스:
RAWSCRIPT [Values]
여기서:
Values(값) OP_CODE, COP_CODE 및 그 정수 입력의 어레이(리스트)
컴파일러 연산:
컴파일러는 먼저 값들의 세트가 함께 유효한 비트코인 스크립트를 구성하는지를 유효성 검증한다. 즉, OP_CODE들은 모두 현재 허용된 활성화된 OP_CODE들이고, COP_CODE들은 모두 COP_CODE들의 렉시컨(lexicon)에 존재하고, 이들은 모두 예상 입력 값을 갖는다.
다음으로, 컴파일러는 출력 스크립트의 현재 장소에 값을 작성한다.
HLL 구문: CALCULATE TEMP
설명:
메인 스택의 상위에 결과를 배치하는 유효한 계산이 수행된다. '유효한(valid)'이란 그것이 HLL에 현재 이용 가능한 함수 구문들 중 하나임을 의미한다. 프로그래머는 TEMP가 나중에 참조될 때 이용 가능하도록(즉, 계속해서 스택의 상위에 있도록) 프로그램을 작성해야 한다. TEMP는 한 번만 참조될 수 있다는 점에 유의한다. (한 번을 초과하여 필요해지면, 대신하여 변수로서 DECLARE되어야 한다.)
신택스:
CALCULATE TEMP = 표현식
컴파일러 연산:
표현식이 유효한지(현재 이용 가능한 함수 구문 리스트의 멤버인지)를 검사한다.
스택의 상위에 결과(TEMP)를 남기고, 표현식을 실행한다.
TEMP에 대한 하기의 참조를 파싱한다 ― 참조시에 TEMP가 실제로 스택의 상위에 있는지를 결정하고: 없으면 컴파일 에러가 발생한다.
실시예:
CALCULATE TEMP = HASH160 (123456789)
HLL 구문: HASH160
설명:
이는 OP_CODE: OP_HASH160과 동등한 해싱 알고리즘을 수행한다
신택스:
HASH160 (value1)
여기서:
value1은 다음 중 어느 하나이다:
하드코딩된 정수
DECLARE된 상수
DECLARE된 변수
컴파일러 연산:
value1이 하드코딩된 숫자이면, 스택의 상위에 푸시된다.
value1이 변수 또는 상수이면, RETRIEVE된다(스택의 상위에 둔다)
컴파일러는 다음을 작성한다:
OP_HASH160
HLL 구문: RETRIEVE
설명:
변수 또는 상수가 메모리 내의 그 장소로부터 검색되어 메인 스택의 상위에 복사된다. 원래의 값은 '메모리' 내의 그 현재 장소에 변함없이 유지된다.
신택스:
RETRIEVE (Item-name)
여기서:
Item-name(항목-이름) DECLARE된 변수 또는 상수
컴파일러 연산:
주: 컴파일러는 양 스택 상의 변하는 항목 수에 대한 지식(말하자면: Main_Stack_Height 및 ALT_Stack_Height)을 유지한다. 또한, 컴파일러는 선언 섹션 동안 설정된 각각의 스택 상의 각각의 변수 및 상수의 위치도 알고 있다. 즉, Item-posn = 스택에서의 Item-name의 위치(즉, 스택의 하위로부터의 항목의 수)이다. 연산은 블록 차용(Borrow Block) 기술을 사용한다.
Item-Depth = Stack_Height - Item-posn + 1을 계산한다(Calculate Item-Depth = Stack_Height - Item-posn + 1)
필요한 항목이 대체 스택에 있을 있을 경우(즉, 변수일 경우)
OP_FROMALTSTACK을 Item-depth 회 작성한다(Write OP_FROMALTSTACK Item-depth times) /* 필요한 변수를 메인 스택의 상위로 가져온다
OP_DUP를 작성한다(Write OP_DUP) /* 나중에 사용하기 위해 값을 메인 스택에 복제한다
하기의 Item-Depth 횟수를 작성한다:(Write the following Item-Depth times:) /* 복제된 값을 하위로 이동시킨다
<Item-Depth + 1> /* 차용한 변수 세트.
OP_ROLL
OP_TOALTSTACK을 Item-depth 회 작성한다(Write OP_TOALTSTACK Item-depth times) /* 차용한 변수를 모두 대체 스택으로 대체한다
필요한 항목이 메인 스택에 있을 경우(즉, 상수일 경우)
<Item-Depth> OP_PICK을 작성한다(Write <Item-Depth> OP_PICK) /* 필요한 상수를 메인 스택의 상위로 복사한다
실시예: 변수 C의 복사본을 검색한다
메모리 할당은 다음과 같다고 가정한다:
Figure pct00006
이 작업은 변수 C의 복사본을 메인 스택의 상위에 배치하기 위한 것이다. 컴파일러는 대체 스택에서의 C의 깊이가: C-Depth = 4임을 알고 있다. 컴파일러는 하기의 스크립트 코드를 생성한다:
OP_FROMALTSTACK /* 대체 스택의 상위를 메인 스택으로 4회 이동시킨다(즉, C_Depth 횟수)
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK
Figure pct00007
OP_DUP /* C의 값을 스택의 상위에 복제한다
Figure pct00008
<C_Depth + 1> OP_ROLL /* 깊이 5로부터 OP_ROLL(즉, C_Depth +1)
<C_Depth + 1> OP_ROLL /* 이것을 4회 행한다(즉, C-Depth 횟수)
<C_Depth + 1> OP_ROLL
<C_Depth + 1> OP_ROLL
Figure pct00009
TO-ALTSTACK /* 차용한 변수를 대체 스택으로 반환한다
TO-ALTSTACK /* 즉, TO_ALTSTACK을 C-Depth 회 수행한다
TO-ALTSTACK
TO-ALTSTACK
Figure pct00010
/* 필요한 변수 값이 메인 스택의 상위에 유지된다
예약어(RESERVED WORDS)
예약어: NUM_INPUTS
설명:
이는 항상 메모리 블록의 하위 상수이다. 즉, 이는 할당된 스택 위치들의 블록에서 '제1' 항목이다. 이것이 상수이더라도, 컴파일시에는 알지 못한다. 따라서, 어떠한 하드-코딩된 스크립트 연산에 대해서도 컴파일러에 의해 사용될 수 없다(예를 들어, 컴파일된 코드에서 얼마나 많은 OP_TOALTSTACK 스테이트먼트를 생성할지를 카운트할 숫자로서 사용될 수 없다). 실행시에 알려지므로, Loop(루프) 및 IF 스테이트먼트에서 조건 테스트와 같은 작업을 위해 프로그래머 또는 컴파일러에 의해 사용될 수 있다.
예약어: TEMP
설명:
이는 계산된 후에 스택의 상위에 남겨진 임시 일회성 변수이다. 이는 프로그래머가 계산에 참조할 수 있게 한다. 컴파일러는 프로그램에서 나중에 참조될 때 TEMP가 여전히 스택의 상위에 있는지를 확인하기 위해 신택스를 검사한다.
예약어: CONSTANTS
설명:
이는 DECLARE 구문과 함께 사용된다. 그 뒤에 메인 스택 상으로 푸시될 상수 리스트가 이어진다.
예약어: VARIABLES
설명:
이는 DECLARE 구문과 함께 사용된다. 그 뒤에 대체 스택 상으로 푸시될 변수 리스트가 이어진다.
예시의 목적상, 이제 WHILE 루프, 예시적인 HLL 프로그램 및 그것에서 컴파일되는 비트코인 스크립트 코드를 포함하는 사용 사례를 제공한다. 비트코인 스크립트 코드는 비트코인 스크립팅 언어 Script에 속하는 op_code를 채용한다. 비트코인 스크립트 코드는 종래와 같이 /* 또는 // 로 시작하는 주석을 포함한다. 이 주석은 컴파일러에 의해 생성되는 비트코인 스크립트의 일부일 필요는 없지만, 예시적인 비트코인 스크립트 코드를 생성함에 있어서의 컴파일러의 연산을 설명하기 위해 아래에 포함된다.
While 루프 실시예 ― 트랜잭션(Tx)
10가지의 하드-코딩된 해시 퍼즐로 이루어진 내부 리스트를 갖는 블록체인 트랜잭션(Tx)을 고려한다. Tx의 출력을 잠금 해제하기 위해, 소비자는 적어도 3가지의 정확한 해시 해법을 제공할 필요가 있다. 트랜잭션 잠금 스크립트는 동일한 입력에서(즉, 'scriptsig'에서) 순서에 상관없이 최대 12번의 시도를 허용한다. 트랜잭션은 각각의 입력 '시도(try)'를 해싱해서, 내부에 저장된 해시 값들 중 하나와 매칭되는지를 검사한다.
명확성을 위해, 다음과 같이 비트코인 트랜잭션의 INPUT 섹션에서의 잠금 해제 스크립트를 설명하는 기존 방식을 고려한다:
<scriptSig> <scriptPubkey>
제1 부분 <scriptSig>는 소비된 이전 트랜잭션의 OUTPUT을 잠금 해제하기 위해 소비 트랜잭션에 포함되는 데이터 및/또는 OP_CODE이다. 제2 부분 <scriptPubkey>는 소비된 이전 트랜잭션의 OUTPUT에서 사용되는 잠금 스크립트이다.
이들을 다음과 같이 인용한다:
<Spender Input> <locking script>
Spender Input은 TRY1 TRY2 TRY3 TRY4 TRY5라고 가정한다
즉, 소비자는 5가지의 가능한 서로 다른 해시 해법을 시도했고, 위에서 지정된 규칙에 따르면, 트랜잭션을 잠금 해제하기 위해 그중 3가지만이 정확하면 된다. 결합된 <Spender Input> <locking script>가 실행될 경우, 제1 연산은 이 실시예에서는 5개의 데이터 항목을 스택 상으로 단순히 푸시하고 있는 <Spender Input>에서의 모든 연산이 된다.
잠금 스크립트 논리(Locking Script Logic) 의사 코드(Pseudocode)
주: 내포형 WHILE 루프가 존재한다
표준 제1 단계: 입력의 수를 카운트하고 NUM_INPUTS로서 저장한다
스크립트에서 사용되는 변수 및 상수를 선언하고 기지의 값들을 초기화한다:
Constants(상수) /* 이들은 메인 스택에 놓인다
Try[12] = 0 /* 12개의 값의 어레이가 모두 0으로 초기화된다
Correct_Needed = 3 /* 규칙에 대하여 하드-코딩된다
NUM_Hashes = 10 /* 규칙에 대하여 하드-코딩된다
/* 10개의 해시 값의 어레이가 하드코딩된다
HASH_SAVED[1] = 20-byte hash value
HASH_SAVED[2] = 20-byte hash value
...
HASH_SAVED[10] = 20-byte hash value
Variables(변수) /* 이들은 대체 스택에 놓인다
Correct_counter = 0 /* 히트(정확한 매칭) 수를 카운트한다
Try_counter = 0 /* 외부 루프에 대한 인덱스
Hash_Counter = 0 /* 내부 루프에 대한 인덱스
Match_Found = FALSE /* 히트(해시 매칭)를 검출하기 위한 불린(Boolean)
IF NUM_Inputs > 12 /* 규칙에 의하면 최대 입력은 12이다
Abort(중단) /* 소비자가 이 규칙을 어기면 중단한다
END-IF
내부 어레이에 소비자의 입력 값들을 채운다(즉, 이 실시예에서는, 입력 값들 TRY1 TRY2 TRY3 TRY4 TRY5에 Try[1] - Try[5]를 할당한다). 어레이의 나머지는 0 값으로 유지된다.
/* 여기서 외부 루프가 시작하고: 각각의 입력 값(TRY1 - TRY5)을 취해서 검사를 위해 해싱한다
WHILE (Try_counter < NUM_Inputs AND Correct_counter < Correct_Needed)
Increment Try_counter
Reset(재설정)
Hash_counter = 0
Match_Found = FALSE
Calculate Hash (Try[Try_counter])
/* 여기서 내부 루프가 시작하고: 각각의 저장된 해시 값에 대해서는, 해싱된 Try 값과 매칭되는지를 검사한다
WHILE (Match_Found = FALSE AND Hash-Counter < NUM_Hashes)
Increment Hash_counter
IF Hash (Try[Try_counter]) = HASH-SAVED[Hash_counter]
Set MATCH_Found = True
Increment Correct_counter
END-IF
END-WHILE
END-WHILE
IF Correct_Counter ≥ Correct_Needed
트랜잭션을 유효한 것으로 표시한다(Mark transaction as Valid)
정식 HLL 프로그램(Formal HLL program)
하기의 코드는 본 개시물의 실시형태에 따른 신택스를 사용해서 HLL로 작성된다. WHILE의 사용을 예시하기 위한 것이지만, 필요에 따라, 다른 HLL 구문들(이들은 대문자로 표시됨(CAPITALISED))을 또한 포함하고, 이들 중 일부는 위에서 상세하게 기재되었지만, 종래의 현대 고급 언어에 의해 사용되는 친숙한 구문이기 때문에 당업자에 의해 용이하게 이해될 것이다.
INITIATE /* NUM_INPUTS의 값을 설정한다
DECLARE /* 메모리를 할당한다
CONSTNATS /* 이들은 메인 스택에 놓인다
Try[] = 0 /* 12개의 값의 어레이가 모두 0으로 초기화된다
Correct_Needed = 3 /* 규칙에 대하여 하드-코딩된다
NUM_Hashes = 10 /* 규칙에 대하여 하드-코딩된다
HASH_SAVED[1] = 233...23768/* 10개의 해시 값의 어레이가 하드코딩된다
HASH_SAVED[2] = 133...23798
...
HASH_SAVED[10] = 193...03791
VARIABLES /* 이들은 대체 스택에 놓인다
Correct_counter = 0 /* 히트(정확한 매칭) 수를 카운트한다
Try_counter = 0 /* 외부 루프에 대한 인덱스
Hash_Counter = 0 /* 내부 루프에 대한 인덱스
Match_Found = FALSE /* 히트(해시 매칭)를 검출하기 위한 불린(Boolean)
END_DECLARE
IF NUM_INPUTS > 12 /* 최대 허용 입력 = 12이다(하드 코딩됨)
ABORT
END_IF
/* 각각의 어레이 요소에 대하여, 스택 상에서 이용 가능한 상응하는 입력 값이 있는지를 검사하고, 있다면 그것을 상응하는 어레이 요소에 채우기 위해 사용한다.
IF NUM_INPUTS ≥ 1
POPULATE (1,Try[1]) /* 메모리에 대한 입력을 판독한다
END_IF
IF NUM_INPUTS ≥ 2
POPULATE (2,Try[2])
END_IF
IF NUM_INPUTS ≥ 3
POPULATE (3,Try[3])
END_IF
IF NUM_INPUTS ≥ 4
POPULATE (4,Try[4])
END_IF
IF NUM_INPUTS ≥ 5
POPULATE (5,Try[5])
END_IF
IF NUM_INPUTS ≥ 6
POPULATE (6,Try[6])
END_IF
IF NUM_INPUTS ≥ 7
POPULATE (7,Try[7])
END_IF
IF NUM_INPUTS ≥ 8
POPULATE (8,Try[8])
END_IF
IF NUM_INPUTS ≥ 9
POPULATE (9,Try[9])
END_IF
IF NUM_INPUTS ≥ 10
POPULATE (10,Try[10])
END_IF
IF NUM_INPUTS ≥ 11
POPULATE (11,Try[11])
END_IF
IF NUM_INPUTS ≥ 12
POPULATE (12,Try[12])
END_IF
/* 외부 루프. 복합 조건에 유의한다
WHILE (12, Try_Counter < NUM_INPUTS AND Correct_counter < Correct_Needed)
INCREMENT (Try_counter)
RESET (Hash_Counter, 0)
RESET (Match_Found, FALSE)
CALCULATE TEMP = HASH160 (Try(Try_counter))
/* 내부 루프. 다른 복합 조건
WHILE (NUM_HASHES, Match_Found = FALSE AND Hash_counter < NUM_Hashes)
INCREMENT (Hash_counter)
IF TEMP = HASH_SAVED[Hash_Counter]
RESET (Match_found, TRUE)
INCREMENT (Correct_counter)
END_IF
END_WHILE
END_WHILE
IF Correct_Counter ≥ Correct Needed
OP_TRUE /* 이는 트랜잭션을 유효한 것으로 표시한다
END_IF
컴파일된 비트코인 스크립트(Compiled Bitcoin Script)
/* INITIATE
OP_DEPTH // NUM_INPUTS(예약어)을 결정하고, 스택의 상위에 배치한다.
/* DECLARE CONSTANTS. 상수를 초기화하고 메인 스택 상에 놓는다. 컴파일러는 상수의 위치를 알고 있다; 12개의 값의 어레이(이들은 '시도 값(try values)'이고 ― 나중에 실제 입력 값으로 채워진다)
사실상 어레이: Try[12]
OP_0 OP_0 OP_0 OP_0 OP_0 OP_0 OP_0 OP_0 OP_0
OP_3 // Correct_Needed ― TX를 잠금 해제하는 데 필요한 정확한 해시 히트의 수는 3으로 하드코딩된다
OP_10 // Num_Hashes ― 어레이에서의 해시의 수는 10으로 하드코딩된다
/* 하드코딩된 해시 값들은 메인 스택에 저장됨(즉, 다음 20 바이트를 스택 상으로 푸시함) 사실상 어레이 HASH-SAVED[10].
20 HASH-SAVED1
20 HASH-SAVED2
20 HASH-SAVED3
20 HASH-SAVED4
20 HASH-SAVED5
20 HASH-SAVED6
20 HASH-SAVED7
20 HASH-SAVED8
20 HASH-SAVED9
20 HASH-SAVED10
/* DECLARE VARIABLE 변수(인덱스 및 불린)를 초기화하고 대체 스택 상에 놓는다. 컴파일러는 위치를 알고 있다.
OP_0 OP_TOALTSTACK // Correct_Counter ― 정확한 히트 수(해시 매칭이 확인될 경우)
OP_0 OP_TOALTSTACK // Try_counter ― 외부 루프에 대한 인덱스: 입력 값에 대한 카운터가 시도됨
OP_0 OP_TOALTSTACK // Hash_counter ― 내부 루프에 대한 인덱스: 해시에 대한 카운터가 시도됨.
OP_0 OP_TOALTSTACK // Match_found ― 불린 플래그: 해시 매칭이 확인될 경우 True로 설정됨
/* 이 단계에서, 대체 스택이 채워지고 변수에 대한 메모리 저장소로서 작용한다. 컴파일러는 변수의 장소, 즉 대체 스택 상의 그 '깊이'를 '계속 추적'할 필요가 있다. 메인 스택은 상수로 채워져 있다. 컴파일러는 그 위치도 계속 추적할 필요가 있다. 메인 스택 메모리 블록의 '제1 값'은 NUM_INPUTS의 위치로 간주된다(그 아래에 얼마나 많은 항목이 있는지와 관계 없음).
/* 이 단계에서, 컴파일러는 NUM_INPUTS에 대한 값이 메인 스택에서 깊이 27에 있음을 알고 있다. 이후의 연산은 이 값을 스택의 상위에 복사한다. 이후, 값 '12'를 스택의 상위로 푸시하고 '>'를 사용해서 비교한다. NUM_INPUTS > 12이면(최대 12번의 '시도' 허용 횟수에 대응), 중단한다. OP_VERIFY가 결과를 스택의 상위에 남기기 때문에, 연산은 OP_DROP을 사용할 수 있다.
27 OP_PICK OP_12 OP_GREATERTHAN OP_VERIFY OP_DROP
/* Try[] 어레이 채우기(POPULATE THE Try[] array). 주: Try[] 어레이 채우기에 대한 코드의 블록은 본원의 명확성 및 가독성을 개선하기 위해 도 2로 이동되어 있다. 컴파일러는 Tx 출력의 소비자에 의해 공급되는 입력 값을 판독해서 Try[] 어레이를 채우는 데 사용할 스크립트 코드의 블록을 작성한다고 가정한다. 일 실시예에 있어서, 제공된 입력은 단지 5개(즉, 5번의 '시도')이므로, Try[]의 처음 5개의 요소만이 채워지고 다른 요소들은 값 0으로 유지된다.
/* 외부 WHILE 루프(Outer WHILE loop). 가능한 최대 반복 횟수는 12(예를 들어, 미리 정해진 규칙에 따름)이므로, 컴파일러는 하기의 op_code 시퀀스를 12회 복제함으로써 외부 WHILE 루프를 언롤링한다.
/* 조건1(Condition1): 'Try_counter < NUM_Inputs이고 Correct_counter < Correct_Needed인가?(is Try_counter < NUM_Inputs AND Correct_counter < Correct_Needed?)'에 대한 블록 차용(Borrow Block). 조건1에서 테스트를 하기 위해, 대체 스택으로부터 변수를 추출할 필요가 있고; 테스트를 수행하고 나서 변수를 다시 넣는다('블록 차용').
/* 먼저 Try_counter의 복사본을 취해서 스택의 상위에 배치한다.
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_DUP
OP_4 OP_ROLL
OP_4 OP_ROLL
OP_4 OP_ROLL
OP_TOALTSTACK
OP_TOALTSTACK
OP_TOALTSTACK
/* 다음으로, NUM_Inputs의 복사본을 취해서 스택의 상위에 배치하고; 컴파일러는 이 상수가 현재 메인 스택 상의 깊이 14에 있음을 알고 있다
OP_14 OP_PICK
/* 이제, 조건1의 부분1(part1)에 대하여 상위 2개의 스택 항목을 비교하고; 이는 'Try-Counter < NUM_Inputs?'를 검사해서 결과를 스택의 상위에 남긴다
OP_LESSTHAN
/* 조건1의 부분2(part2) 검사를 한다('Correct_counter < Correct_Needed인가?'). 결과를 스택의 상위에 남긴다
/* 먼저 Correct_counter의 복사본을 취해서 스택의 상위에 배치한다.
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_DUP
OP_5 OP_ROLL
OP_5 OP_ROLL
OP_5 OP_ROLL
OP_5 OP_ROLL
OP_TOALTSTACK
OP_TOALTSTACK
OP_TOALTSTACK
OP_TOALTSTACK
OP_13 OP_PICK // 스택의 상위에 Correct_Needed를 복사하고: 컴파일러는 이 상수가 현재 깊이 13에 있음을 알고 있다.
OP_LESSTHAN // 이제 조건1의 부분2에 대하여 상위 2개의 스택 항목을 비교하고; 이는 'Correct_counter < Correct_needed?'를 검사해서 결과를 스택의 상위에 남긴다
OP_BOOLAND // 이는 조건1의 조합 검사를 완료하고: 조건1의 두 부분의 검사의 결과는 스택의 상위에 있다. 이 연산 이후에, 조건1의 최종 결과는 스택의 상위에 있다. 이는 다음 IF에 의해 팝(pop; 제거)된다.
OP_IF
/* Try-Counter의 증분을 위한 블록을 차용한다. 제1 단계는 블록을 메인 스택의 상위로 가져오는 것이다. 컴파일러는 대체 스택 상의 그 깊이를 알고 있다(이 경우, 깊이 = 3).
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_ADD1
OP_TOALTSTACK
OP_TOALTSTACK
OP_TOALTSTACK
/* Hash_counter = 0을 재설정하기 위한 블록을 차용한다. 컴파일러는 이 변수의 위치를 알고 있다
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_DROP OP_0
OP_TOALTSTACK
OP_TOALTSTACK
/* Match-Found = FALSE를 재설정하기 위한 블록을 차용한다. 컴파일러는 이 변수의 위치를 알고 있다
OP_FROMALTSTACK
OP_DROP OP_FALSE
OP_TOALTSTACK
/* 필요한 'Try' 값을 스택의 상위로 복사하고 해싱한다
<Try-depth> OP_PICK
OP_HASH160 // 정식 HLL에 있어서, 이는 스택의 상위에 남는 TEMP의 값이다. 추가적인 연산은 더 많은 값을 메인 스택 상으로 푸시하는 한편, 메인 스택으로부터 팝한다. 본 발명은 TEMP의 값이 다음에 필요해질 때(품질 검사를 위해) 스택의 상위에 있게 된다는 것이다. 컴파일러는 정식 HLL 코드에 기초하여 스택에 무엇이 있는지를 항상 추적할 수 있기 때문에, 컴파일시에 이것을 검증할 수 있다.
/* 내부 WHILE 루프(Inner WHILE Loop)
/* 내부 WHILE 루프는 주어진 실시예에 있어서는 최대값 10을 갖는 Num_Hashes 반복에 대하여 수행된다. 따라서, 컴파일러는 Num_Hashes 반복(10회 이하의 반복)에 대한 하기의 op_code 시퀀스를 외부 WHILE 루프(Outer WHILE Loop)의 각각의 반복 내에서 복제함으로써 내부 WHILE 루프를 언롤링한다.
/* 조건2(Condition2): 'Match_Found = FALSE이고 Hash-Counter < NUM_Hashes인가?(Is Match_Found = FALSE AND Hash-Counter < NUM_Hashes?)'에 대한 블록 차용(Borrow Block). 조건1에서 테스트를 수행하기 위해, 대체 스택으로부터 변수를 추출할 필요가 있으며; 테스트를 수행하고 나서 변수를 다시 넣는다('블록 차용').
/* 먼저 조건2의 부분1(part1)에 대한 변수 Match_Found의 복사본을 취해서 스택의 상위에 배치한다. 컴파일러는 이 변수의 위치를 알고 있다
OP_FROMALTSTACK
OP_DUP
OP_2 OP_ROLL
OP_TOALTSTACK
/* Match_Found = FALSE인지를 검사하고 결과를 스택의 상위에 배치한다
OP_NOT
/* 이제, 조건2의 부분2(part2)에 대한 변수 Hash_Counter 및 NUM_Hashes의 복사본을 취한다(Hash_Counter < NUM_Hashes일 경우 테스트한다). 컴파일러는 이들 변수의 위치를 알고 있다
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_DUP
OP_3 OP_ROLL
OP_3 OP_ROLL
OP_TOALSTACK
OP_TOALSTACK
OP_ 13 OP_PICK
/* Hash_Counter < NUM_Hashes를 검사한다
OP_LESSTHAN
/* 조건2의 조합 검사를 완료하고: 조건2의 두 부분의 검사의 결과는 스택의 상위에 있다. 이 연산 이후에, 최종 결과가 스택의 상위에 남는다.
OP_BOOLAND
/* 조건2 테스트의 결과는 스택의 상위에 있다. 이는 다음 IF에 의해 팝된다.
OP_IF
/* Hash_Counter 증분을 위한 블록을 차용한다
/* 필요한 해시 값의 깊이(즉, <Hash-depth>)는 current-stack-height - Hash1-position - Hash_counter + 1로 컴파일러에 의해 계산될 수 있다
/* 컴파일러는 모든 상수의 위치에 대한 지식을 유지할 수 있기 때문에, 제1 해시 값의 위치가 9임을 알고 있다(5개의 Try 값이 있고, 스택의 하위에 3개의 다른 상수가 있기 때문임).
/* 메인 스택의 상위에 하나의 TEMP 값이 있으므로, 현재의 스택 높이는 19이다. HASH-SAVED[4] (Hash_counter = 4)의 깊이를 원하면, 깊이는:
Hash-depth = 19 - 9 - 4 + 1 = 8
(즉, 현재 메인 스택의 상위로부터 8임)
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_ADD1
OP_TOALTSTACK
OP_TOALTSTACK
<Hash-depth> OP_PICK
/* 스택의 상위 두 번째는 내부 루프(TEMP) 직전에 수행되는 OP_HASH160 연산의 결과이고; 다음 연산은 내부에 저장된 해시 값에 대하여 해싱된 Try 값(TEMP)을 검사한다
OP_EQUAL
OP_IF
/* Match_Found = True로 설정한다
OP_FROMALTSTACK
OP_DROP
OP_TRUE
OP_TOALTSTACK
/* Correct_counter를 증분한다
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_ADD1
OP_TOALTSTACK
OP_TOALTSTACK
OP_TOALTSTACK
OP_TOALTSTACK
OP_ENDIF
OP_ENDIF
/* END OF Inner WHILE loop(내부 WHILE 루프의 종료).
/* NUM_INPUTS을 검색하기 위한 연산 부호
/* NUM_INPUTS ≥ 1을 검사하기 위한 연산 부호
OP_IF
내부 WHILE 루프의 두 번째 반복에 대한 op_code 시퀀스의 복제
END_IF
/* NUM_INPUTS ≥ 2를 검사하기 위한 연산 부호
OP_IF
내부 WHILE 루프의 세 번째 반복에 대한 op_code 시퀀스의 복제
END_IF
/* NUM_INPUTS ≥ 3을 검사하기 위한 연산 부호
OP_IF
내부 WHILE 루프의 네 번째 반복에 대한 op_code 시퀀스의 복제
END_IF
/* NUM_INPUTS ≥ 4를 검사하기 위한 연산 부호
OP_IF
내부 WHILE 루프의 다섯 번째 반복에 대한 op_code 시퀀스의 복제
END_IF
/* NUM_INPUTS ≥ 5를 검사하기 위한 연산 부호
OP_IF
내부 WHILE 루프의 여섯 번째 반복에 대한 op_code 시퀀스의 복제
END_IF
/* NUM_INPUTS ≥ 6을 검사하기 위한 연산 부호
OP_IF
내부 WHILE 루프의 일곱 번째 반복에 대한 op_code 시퀀스의 복제
END_IF
/* NUM_INPUTS ≥ 7을 검사하기 위한 연산 부호
OP_IF
내부 WHILE 루프의 여덟 번째 반복에 대한 op_code 시퀀스의 복제
END_IF
/* NUM_INPUTS ≥ 8을 검사하기 위한 연산 부호
OP_IF
내부 WHILE 루프의 아홉 번째 반복에 대한 op_code 시퀀스의 복제
END_IF
/* NUM_INPUTS ≥ 9를 검사하기 위한 연산 부호
OP_IF
내부 WHILE 루프의 열 번째 반복에 대한 op_code 시퀀스의 복제
END_IF
/* END OF Outer WHILE loop(외부 WHILE 루프의 종료).
외부 WHILE 루프의 두 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 세 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 네 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 다섯 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 여섯 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 일곱 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 여덟 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 아홉 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 열 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 열한 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
외부 WHILE 루프의 열두 번째 반복에 대한 op_code 시퀀스의 복제(내부 WHILE 루프의 NUM_INPUTS 반복(최대 10회)에 대한 op_code 시퀀스의 복제를 포함)
/* 외부 WHILE 루프의 12회의 반복의 완료 후에, 컴파일러는 필요한 히트 수에 도달했는지를 검사한다(즉, 컴파일러는 Correct_counter ≥ Correct_Needed인지를 검사한다)
OP_FROMALTSTACK // 메인 스택의 상위까지Correct_counter를 검색한다
OP_FROMALTSTACK
OP_FROMALTSTACK
OP_FROMALTSTACK // Correct_Needed를 스택의 상위에 복사한다
OP_12 OP_PICK
OP_GREATERTHAN
// 이 최종 연산은 테스트의 결과를 스택의 상위에 남긴다. TRUE(즉, Correct_counter ≥ Correct_Needed)이고 가능하게는 다른 검사들이 통과되면, 트랜잭션들은 유효한 것으로 표시된다.
실시형태들에 있어서, 블록체인 컴파일러는 적어도 한 번 출력 스크립트를 최적화해서 보다 효율적인 또는 감소된 버전의 출력 스크립트를 제공하도록 구성될 수 있다. 이는 미분 없는 최적화(derivative free optimisation)(DFO)의 사용을 수반할 수 있다. DFO는 본 기술분야에 알려져 있고 당업자가 쉽게 이해할 수 있는 용어이다. 부가적으로 또는 대안으로서, 출력 스크립트를 생성하는 단계는 미분 없는 최적화의 사용을 포함할 수 있다.
실시형태들에 있어서, 블록체인 컴파일러는 소프트웨어 개발 키트(SDK)의 일부를 형성하거나, 및/또는 SDK와 함께 동작하도록 배열될 수 있다. SDK는 코드-기반 해법의 생성을 용이하게 하도록 SDK와 함께 사용되는 것으로 알려진 에디터, 디버거 및 그 밖의 컴포넌트(들)를 포함할 수 있다.
도 3은 본 개시물의 일 실시형태에 따른 블록체인과 연계되는 예시적인 블록체인 네트워크(1000)를 도시한다. 이 실시형태에 있어서, 예시적인 블록체인 네트워크(1000)는 블록체인 프로토콜의 인스턴스를 실행하는 피어-투-피어 분산 전자 장치로 구성된다. 일부 실시예에 있어서, 분산 전자 장치는 노드(1002)로 인용된다. 블록체인 프로토콜의 실시예는 비트코인 프로토콜이다.
노드(1002)는 임의의 적절한 컴퓨팅 장치로(예컨대, 데이터 센터의 서버에 의해, 클라이언트 컴퓨팅 장치(예컨대, 데스크톱 컴퓨터, 랩톱 컴퓨터, 태블릿 컴퓨터, 스마트폰 등)에 의해, 컴퓨팅 리소스 서비스 제공자의 분산형 시스템에서의 다수의 컴퓨팅 장치에 의해, 또는 도 5의 컴퓨팅 장치(2600)와 같은 임의의 적절한 전자 클라이언트 장치에 의해) 구성될 수 있다.
일 실시형태에 있어서, 노드(1002)들 중 하나 이상의 노드는 노드(1002)들 중 하나 이상의 다른 노드에 통신 가능하게 연결된다. 이러한 통신 가능한 연결은 잘 알려져 있는 하나 이상의 유선 또는 무선 통신 링크를 이용할 수 있다. 일 실시형태에 있어서, 노드(1002)들 각각은 블록체인에서의 모든 트랜잭션의 "원장(ledger)"의 적어도 일부를 유지한다. 이러한 방식으로, 원장은 분산 원장이다. 원장에 영향을 미치는 노드에 의해 처리되는 블록체인 트랜잭션은 원장의 무결성이 유지되도록 하나 이상의 다른 노드들에 의해 유효성 검증된다.
일 실시형태에 있어서, 노드(1002)들 중 적어도 일부는 암호화 문제의 해결과 같은 복잡한 계산을 수반하는 채굴 프로세스를 수행하는 채굴자 노드이다. 암호화 문제를 해결한 채굴자 노드는 블록체인을 위한 새로운 블록을 생성하고 새로운 블록을 다른 노드(1002)들에 브로드캐스트한다. 다른 노드(1002)들은 채굴자 노드의 작업을 검증하고, 검증시에, 블록을 블록체인에 수용하는 검증 프로세스를 수행한다(예컨대, 블록을 블록체인의 분산 원장에 추가하는 것에 의함). 일부 실시예에 있어서, 블록은 이전 블록의 타임스탬프(timestamp) 및 "핑거프린트(fingerprint)"(예컨대, 해시)로 표시되곤 하는 트랜잭션들의 그룹이다. 이러한 방식으로, 각각의 블록이 이전 블록과 연결되고, 그에 따라 블록체인에서 블록들을 연결하는 "체인(chain)"이 생성된다. 실시형태들에 있어서, 유효한 블록들은 노드(1002)들의 컨센서스에 의해 블록체인에 추가된다. 또한, 일부 실시예에 있어서, 블록체인은 유효성 검증된 블록들의 리스트를 포함한다.
일 실시형태에 있어서, 노드(1002)들 중 적어도 일부는 본 개시물에 개시된 바와 같이 트랜잭션들을 유효성 검증하는 유효성 검증 프로세스를 수행하는 유효성 검증 노드로서 동작한다. 도 3은 1004로 표시된 하나의 예시적인 트랜잭션을 도시한다. 일부 실시예에 있어서, 트랜잭션은 디지털 자산(예컨대, 비트코인 토큰의 수량)의 소유권의 증명을 제공하는 데이터 및 디지털 자산의 소유권/제어를 수용 또는 전송하기 위한 조건을 포함한다. 일부 실시예에 있어서, "소비 트랜잭션(spending transaction)"은 이전 트랜잭션의 아직 소비되지 않은 트랜잭션 출력(UTXO)에 의해 표시되는 디지털 자산의 적어도 일부를 블록체인 어드레스와 연계되는 엔티티에 재연계시키는(예컨대, 소유권 또는 제어를 전송하는) 트랜잭션을 의미한다. 일부 실시예에 있어서, "이전 트랜잭션(previous transaction)"은 소비 트랜잭션에 의해 참조되는 UTXO를 포함하는 트랜잭션을 의미한다. 일부 실시형태에 있어서, 트랜잭션은 "잠금 해제 스크립트(unlocking script)" 및 "잠금 스크립트(locking script)"를 포함할 수 있다. 잠금 스크립트는 트랜잭션이 유효성 검증되고 해당 트랜잭션에 의해 소유권/제어가 전송되기 전에 이행되어야 하는 조건을 갖는 트랜잭션을 저당잡는 데 사용될 수 있다. 일부 실시형태에 있어서, 잠금 스크립트는 트랜잭션의 출력과 연계될 수 있으며 출력을 소비하는 데 필요한 하나 이상의 조건을 정의하도록 구성될 수 있다. 또한, 소비 트랜잭션의 잠금 해제 스크립트는 잠금 해제 스크립트의 실행이 소비 트랜잭션의 유효성 검증을 위해 이전 트랜잭션의 잠금 스크립트의 실행에 의해 평가되는 조건 세트를 도출하는 데 사용된 데이터를 제공하도록 구성될 수 있다. 이전 트랜잭션의 잠금 스크립트 및 소비 트랜잭션의 잠금 해제 스크립트는 비트코인의 스크립트(Bitcoin's Script)와 같이 기능적으로 제한된 저급 스크립팅 언어를 사용해서 작성된다.
일부 실시형태에 있어서, 소비 트랜잭션의 유효성 검증은 이전 트랜잭션의 잠금 스크립트에 의해 지시되는 조건 세트를 만족 및 유효성 검증하기 위해 이전 트랜잭션의 잠금 스크립트를 실행하는 것과 함께 소비 트랜잭션의 잠금 해제 스크립트를 실행하는 것을 수반할 수 있다. 소비 트랜잭션의 유효성 검증은 다른 검사들을 수반할 수 있다. 소비 트랜잭션의 유효성 검증이 성공적이면, 소비 트랜잭션은 다른 네트워크 노드들에 전파될 수 있다. 채굴자 노드는 유효한 소비 트랜잭션을 본 명세서에서 설명되는 바와 같이 블록체인에 추가된 블록의 일부로서 내재하도록 선택할 수 있다.
도 3에 도시된 바와 같이, 본 명세서에서 설명되는 바와 같은 블록체인 컴파일러(1001)는 HLL 프로그램을 블록체인 호환 스크립트(또는 스크립트 단편)로 변환하는 데 사용된다. 이는 블록체인 컴파일러(1001)에 의해 제공되는 출력을 형성할 수 있다는 점에서 "출력 스크립트(output script)"라고 할 수도 있다. 출력 스크립트는 블록체인 트랜잭션(Tx)에 제공될 수 있다. 이는 트랜잭션 출력과 연계되는 잠금 스크립트의 일부 또는 트랜잭션 입력과 연계되는 잠금 해제 스크립트의 일부일 수 있다. 출력 스크립트는 블록체인 네트워크의 노드들에 의해 실행될 수 있는 블록체인 스크립팅 언어로부터 선택되거나, 그에 대하여 고유하거나, 및/또는 그 일부를 형성하는 op_code로 형성될 수 있다. op_code를 프리미티브 또는 명령이라고 할 수 있다. 스크립트의 op_code는 블록체인 네트워크(1000)의 노드들에서 실행되는 인터프리터 또는 가상 기계에 의해 실행될 수 있다. 인터프리터 또는 가상 기계는 스크립트의 op_code를 기계-실행 가능 (목적) 코드로 변환할 수 있다. 블록체인 스크립팅 언어는, 예를 들어, 비트코인 프로토콜과 함께 사용되는 Script 언어 또는 그 변형일 수 있다. 스크립팅 언어는 암호화, 산술 및 스택 조작 op_code를 포함할 수 있다.
컴파일러(1001)는 블록체인 네트워크의 보트(bot)들 또는 노드들에 의해 실행될 수 있는 블록체인 트랜잭션 스크립트(또는 스크립트 단편)를 생성하기 위해 정적 컴파일을 이용하는 SDK의 또는 가능하게는 온라인 서비스의 일부일 수 있다.
대안으로서, 본 명세서에서 설명되는 바와 같은 컴파일러의 방법론은 블록체인 네트워크의 보트 또는 노드의 런타임 환경의 일부로서 사용될 수 있으며, 런타임 환경은 HLL 프로그램(예컨대, 파이선, C++ 등과 같은 3G 언어로 작성되는 프로그램)의 청크를 블록체인 네트워크의 보트 또는 노드에 의해 실행될 수 있는 블록체인 트랜잭션 스크립트 또는 스크립트 단편으로 해석하거나 또는 동적으로 컴파일하거나 또는 변환한다.
도 4는 이전 트랜잭션(202)("TX1"로 표시됨)의 출력을 소비하는 소비 트랜잭션(204)("TX2"로 표시됨)의 유효성 검증 및 채굴을 위한 예시적인 블록체인 프로토콜을 도시한다. 이전 트랜잭션(202)은 토큰 수량(디지털 자산) 및 토큰 수량을 소비하는 데 필요한 조건 세트를 정의하도록 구성되는 잠금 스크립트를 포함하는 출력을 갖는다. 이전 트랜잭션(202)은 블록에 내재되도록 유효성 검증 및 채굴되었고, 이후 해당 블록은 블록체인(208)에 저장되도록 검증된다. 소비 트랜잭션(204)은 이전 트랜잭션(202)의 출력을 참조하는 트랜잭션 출력 식별자 필드("Tx 출력 ID"로 표시됨) 및 잠금 해제 스크립트를 갖는 입력을 포함한다. 이전 트랜잭션(202)의 잠금 스크립트 및 소비 트랜잭션(204)의 잠금 해제 스크립트는 비트코인의 스크립트(Bitcoin's Script)와 같이 기능적으로 제한된 저급 스크립팅 언어를 사용해서 작성된다. 소비 트랜잭션(204)이 유효한 것으로 간주되려면, 입력의 잠금 해제 스크립트는 이전 트랜잭션(202)의 참조된 출력의 잠금 스크립트에 의해 정의되는 조건 세트를 만족하는 데이터를 제공해야 하다. 이전 트랜잭션(202)의 잠금 스크립트(또는 그 일부) 및 소비 트랜잭션(204)의 잠금 해제 스크립트는 본 명세서에서 설명되는 바와 같이 블록체인 컴파일 방법 및 도구에 의해 생성될 수 있다.
소비 트랜잭션(204)은 이전 트랜잭션(202)의 잠금 스크립트에 의해 지시되는 조건 세트를 만족 및 유효성 검증하기 위해 이전 트랜잭션(202)의 잠금 스크립트를 실행하는 것과 함께 소비 트랜잭션(204)의 잠금 해제 스크립트를 실행하는 것에 의해 블록체인 네트워크의 하나 이상의 노드에 의해 유효성 검증된다(도 4 참조). 소비 트랜잭션(204)의 유효성 검증은 다른 검사들을 수반할 수 있다. 소비 트랜잭션(204)의 유효성 검증이 성공적이면, 소비 트랜잭션은 다른 네트워크 노드들에 전파될 수 있다. 채굴자 노드는 유효한 소비 트랜잭션을 본 명세서에서 설명되는 바와 같이 블록체인(208)에 추가된 블록의 일부로서 선택 및 내재하는 채굴 작업을 수행할 수 있다. 블록체인(208) 상에 유효성 검증 및 저장되면, 트랜잭션들(202 및 204)의 시퀀스는 트랜잭션들에 의해 참조되는 토큰 수량(디지털 자산)에 대한 제어의 전송을 제공한다.
도 5는 본 개시물의 적어도 하나의 실시형태를 실시하는 데 사용될 수 있는 컴퓨팅 장치(2600)의 예시적인 간략화된 블록도이다. 다양한 실시형태에 있어서, 컴퓨팅 장치(2600)는 상기에서 예시 및 설명된 바와 같이 블록체인 네트워크의 블록체인 컴파일러 및 네트워크 노드를 구현하는 데 사용될 수 있다. 예를 들어, 컴퓨팅 장치(2600)는 데이터 서버, 웹 서버, 휴대용 컴퓨팅 장치, 개인용 컴퓨터, 또는 임의의 전자 컴퓨팅 장치로서 사용하도록 구성될 수 있다. 도 5에 도시된 바와 같이, 컴퓨팅 장치(2600)는 버스 서브시스템(2604)을 통해 다수의 주변 서브시스템과 통신하도록 구성될 수 있으며 작동 가능하게 연결되는 하나 이상의 프로세서(2602)를 포함할 수 있다. 프로세서(2602)는 본 명세서에서 설명되는 바와 같이 HLL 소스 코드 프로그램을 블록체인 스크립트(또는 그 단편)로 컴파일하는 데 이용될 수 있다. 이들 주변 서브시스템은 메모리 서브시스템(2608) 및 파일/디스크 스토리지 서브시스템(2610)을 포함하는 스토리지 서브시스템(2606), 하나 이상의 사용자 인터페이스 입력 장치(2612), 하나 이상의 사용자 인터페이스 출력 장치(2614), 및 네트워크 인터페이스 서브시스템(2616)을 포함할 수 있다. 이러한 스토리지 서브시스템(2606)은 본 개시물에서 설명되는 트랜잭션과 연계되는 세부 내용과 같은 정보의 임시 또는 장기 보관에 사용될 수 있다.
버스 서브시스템(2604)은 컴퓨팅 장치(2600)의 다양한 컴포넌트들 및 서브시스템들이 의도된 대로 서로 통신할 수 있게 하는 메커니즘을 제공할 수 있다. 버스 서브시스템(2604)이 단일의 버스로서 개략적으로 도시되어 있지만, 버스 서브시스템의 대체 실시형태들은 다수의 버스를 이용할 수 있다. 네트워크 인터페이스 서브시스템(2616)은 다른 컴퓨팅 장치들 및 네트워크들에 대한 인터페이스를 제공할 수 있다. 네트워크 인터페이스 서브시스템(2616)은 컴퓨팅 장치(2600)로부터 다른 시스템들에 데이터를 전송하고 다른 시스템들로부터 데이터를 수신하기 위한 인터페이스로서 기능할 수 있다. 예를 들어, 네트워크 인터페이스 서브시스템(2616)은 데이터 기술자가 사용자 데이터 센터와 같은 원격 위치에 있는 데이터를 전송 및 수신할 수 있도록 데이터 기술자가 장치를 무선 네트워크에 연결하게 할 수 있다. 버스 서브시스템(2604)은 세부 내용, 검색어 등과 같은 데이터를 본 개시물의 감독된 모델에 통신하는 데 이용될 수 있고, 감독된 모델의 출력을 하나 이상의 프로세서(2602)에, 및 네트워크 인터페이스 서브시스템(2616)을 통해 판매자 및/또는 채권자에게 통신하는 데 이용될 수 있다.
사용자 인터페이스 입력 장치(2612)는 키보드와 같은 하나 이상의 사용자 입력 장치; 통합형 마우스, 트랙볼, 터치패드, 또는 그래픽스 태블릿과 같은 포인팅 장치; 스캐너; 바코드 스캐너; 디스플레이에 포함되는 터치 스크린; 음성 인식 시스템, 마이크로폰과 같은 오디오 입력 장치; 및 그 밖의 유형의 입력 장치들을 포함할 수 있다. 일반적으로, "입력 장치(input device)"라는 용어의 사용은 컴퓨팅 장치(2600)에 정보를 입력하기 위한 가능한 모든 유형의 장치 및 메커니즘을 포함하도록 의도된다. 하나 이상의 사용자 인터페이스 츨력 장치(2614)는 디스플레이 서브시스템, 프린터, 또는 오디오 출력 장치와 같은 비-시각적 디스플레이 등을 포함할 수 있다. 디스플레이 서브시스템은 CRT(cathode ray tube), 또는 LCD(liquid crystal display), LED(light emitting diode) 디스플레이, 또는 프로젝션과 같은 플랫-패널 장치 또는 그 밖의 디스플레이 장치일 수 있다. 일반적으로, "출력 장치(output device)"라는 용어의 사용은 컴퓨팅 장치(2600)로부터 정보를 출력하기 위한 가능한 모든 유형의 장치 및 메커니즘을 포함하도록 의도된다. 하나 이상의 사용자 인터페이스 출력 장치(2614)는, 예를 들어, 사용자 상호작용이 적절할 수 있을 경우, 설명되는 프로세스들 및 그 변형들을 수행하는 애플리케이션들과의 그러한 사용자 상호작용을 용이하게 하기 위해 사용자 인터페이스를 제시하는 데 사용될 수 있다.
스토리지 서브시스템(2606)은 본 개시물의 적어도 하나의 실시형태의 기능을 제공할 수 있는 기본 프로그래밍 및 데이터 구조를 저장하기 위한 컴퓨터 판독 가능 저장 매체를 제공할 수 있다. 하나 이상의 프로세서에 의한 실행시에, 애플리케이션(프로그램, 코드 모듈, 명령어)은 본 개시물의 하나 이상의 실시형태의 기능을 제공할 수 있고, 스토리지 서브시스템(2606)에 저장될 수 있다. 이들 애플리케이션 모듈 또는 명령어는 하나 이상의 프로세서(2602)에 의해 실행될 수 있다. 스토리지 서브시스템(2606)은 본 개시물에 따라 사용되는 데이터를 저장하기 위한 저장소를 부가적으로 제공할 수 있다. 스토리지 서브시스템(2606)은 메모리 서브시스템(2608) 및 파일/디스크 스토리지 서브시스템(2610)을 포함할 수 있다.
메모리 서브시스템(2608)은 프로그램 실행 동안 명령어 및 데이터의 저장을 위한 메인 RAM(random access memory)(2618) 및 정해진 명령어가 저장될 수 있는 ROM(read only memory)(2620)을 포함하는 다수의 메모리를 포함할 수 있다. 파일/디스크 스토리지 서브시스템(2610)은 프로그램 및 데이터 파일을 위한 비-일시적인 영구적인(비-휘발성) 스토리지를 제공할 수 있고, 하드 디스크 드라이브, 플로피 디스크 드라이브 및 관련 이동식 매체, CD-ROM(Compact Disk Read Only Memory) 드라이브, 광학 드라이브, 이동식 매체 카트리지, 및 그 밖의 유사한 저장 매체를 포함할 수 있다.
컴퓨팅 장치(2600)는 적어도 하나의 로컬 클록(2624)을 포함할 수 있다. 로컬 클록(2624)은 특정 시작일로부터 발생한 틱(tick)의 수를 나타내는 카운터일 수 있으며 컴퓨팅 장치(2600) 내에 일체로 위치될 수 있다. 로컬 클록(2624)은 컴퓨팅 장치(2600) 및 그 안에 포함되는 서브시스템들 모두에 대한 프로세서들에서 특정 클록 펄스로 데이터 전송을 동기화하는 데 사용될 수 있으며, 컴퓨팅 장치(2600)와 데이터 센터 내의 다른 시스템들 사이의 동기 동작들을 조정하는 데 사용될 수 있다. 일 실시형태에 있어서, 로컬 클록(2624)은 원자 시계이다. 다른 실시형태에 있어서, 로컬 클록은 프로그램 가능 인터벌 타이머이다.
컴퓨팅 장치(2600)는 휴대용 컴퓨터 장치, 태블릿 컴퓨터, 워크스테이션, 또는 후술되는 임의의 다른 장치를 포함하여, 다양한 유형으로 될 수 있다. 부가적으로, 컴퓨팅 장치(2600)는 하나 이상의 포트(예컨대, USB, 헤드폰 잭, 라이트닝(Lightning) 커넥터 등)를 통해 컴퓨팅 장치(2600)에 연결될 수 있는 다른 장치를 포함할 수 있다. 컴퓨팅 장치(2600)에 연결될 수 있는 장치는 광섬유 커넥터를 수용하도록 구성되는 복수의 포트를 포함할 수 있다. 따라서, 이 장치는 광 신호를, 처리를 위해 장치를 컴퓨팅 장치(2600)에 연결하는 포트를 통해 전송될 수 있는 전기 신호로 변환하도록 구성될 수 있다. 컴퓨터 및 네트워크는 시시각각 변하기 때문에, 도 5에서 묘사되는 컴퓨팅 장치(2600)의 설명은 장치의 바람직한 실시형태를 예시할 목적으로 특정 실시예로서만 의도된다. 도 5에서 묘사되는 시스템보다 더 많거나 적은 컴포넌트를 갖는 많은 다른 구성들이 가능하다.
전술한 실시형태들은 본 개시물을 한정하는 것이 아니라 예시하는 것이며, 당업자라면, 첨부된 청구항들에 의해 규정되는 바와 같은 본 개시물의 범위로부터 일탈함이 없이, 다양한 대안적인 실시형태들을 설계할 수 있을 것이라는 점에 유의해야 한다. 본 개시물의 방법, 시스템 및 장치(또는 그 일부)는 몇몇 별개의 요소를 포함하는 하드웨어에 의해, 그리고 적절히 프로그램된 컴퓨터에 의해 구현될 수 있다. 몇 개의 수단을 열거하는 장치 청구항에 있어서, 이들 수단 중 몇몇은 하나의 동일한 하드웨어 아이템에 의해 구체화될 수 있다. 단지 특정 조치들이 서로 다른 종속 청구항들에서 인용된다는 사실만으로 이들 조치의 조합이 유리하게 사용될 수 없다는 것을 나타내는 것은 아니다.
명세서 및 도면은, 결국, 제한적인 의미가 아니라 예시적인 의미인 것으로 간주되어야 한다. 그러나, 청구항들에 제시된 바와 같은 본 발명의 범위로부터 일탈함이 없이 다양한 수정 및 변경이 이루어질 수 있음이 명백할 것이다. 마찬가지로, 그 밖의 변형들도 본 개시물의 범위 내에 있다. 따라서, 개시된 기술은 다양한 수정 및 대체 구성의 영향을 받기 쉽지만, 그 특정한 예시된 실시형태들이 도면에 도시되며 상세하게 전술되었다. 그러나, 본 발명을 개시된 특정 형태 또는 형태들로 제한하려는 의도는 없으며, 반대로, 본 발명은 첨부된 청구항들에서 규정된 바와 같이, 본 발명의 범위 내에서의 모든 수정, 대체 구성 및 등가물을 포함하려는 것이라는 점을 이해해야 한다.
청구항들에 있어서, 괄호 안의 임의의 참조 부호는 해당 청구항들을 제한하는 것으로 해석되지 않아야 한다. 또한, 개시된 실시형태들을 설명하는 문맥에서(특히, 하기의 청구항들의 문맥에서) 부정관사 및 정관사("a", "an", 및 "the") 및 유사한 지시어의 사용은, 문맥상 달리 지시되거나 또는 명백하게 부정되지 않는 한, 단수와 복수를 모두 포함하는 것으로 해석되어야 한다. "포함하는", "갖는", "구비하는" 및 "함유하는"과 같은 용어는 달리 주지되지 않는 한 개방형 용어(즉, "포함하되 한정되지 않는"을 의미함)로서 해석되어야 한다. "연결되는"과 같은 용어는, 수정되지 않고 물리적인 연결을 의미할 경우, 어떤 것이 개입해 있더라도, 부분적으로 또는 전체적으로 내포되거나, 부착되거나, 또는 함께 결합되는 것으로 해석되어야 한다. 본 개시물에서 값들의 범위들을 열거하는 것은, 달리 지시되지 않는 한, 범위 내에 있는 각각의 개별 값을 개별적으로 참조하는 약기법으로서 기능하도록 의도된 것이고, 각각의 개별 값은 마치 개별적으로 열거되어 있던 것처럼 명세서에 포함된다. "세트"(예컨대, "항목 세트") 또는 "서브세트"와 같은 용어의 사용은, 달리 주지되거나 또는 문맥상 부정되지 않는 한, 하나 이상의 멤버를 포함하는 비어 있지 않은 집합으로 해석되어야 한다. 또한, 달리 주지되거나 또는 문맥상 부정되지 않는 한, 상응하는 세트의 "서브세트"라는 용어는 반드시 상응하는 세트의 적절한 서브세트를 의미하는 것은 아니고, 서브세트 및 상응하는 세트는 동일할 수 있다. 요소의 단수형 참조는 그러한 요소들의 복수형 참조를 배제하지 않으며, 그 반대도 마찬가지이다.
"A, B, 및 C 중 적어도 하나" 또는 "A, B 및 C 중 적어도 하나"와 같은 형태의 문구와 같은 접속어는, 특별히 달리 언급되거나 또는 문맥상 달리 명백하게 부정되지 않는 한, 일반적으로 항목, 용어 등이 A 또는 B 또는 C일 수 있거나, 또는 A 및 B 및 C의 세트의 임의의 비어 있지 않은 서브세트일 수 있음을 나타내기 위해 사용되는 것으로 상황에 맞게 이해된다. 예를 들면, 3개의 멤버를 갖는 세트의 예시적인 실시예에 있어서, "A, B, 및 C 중 적어도 하나" 및 "A, B 및 C 중 적어도 하나"와 같은 접속 문구는 다음과 같은 세트들: 즉, {A}, {B}, {C}, {A, B}, {A, C}, {B, C}, {A, B, C} 중 어느 하나를 의미한다. 따라서, 이러한 접속어는 일반적으로 특정 실시형태들이 적어도 하나의 A, 적어도 하나의 B 및 적어도 하나의 C가 각각 존재할 필요가 있음을 암시하려는 것이 아니다.
설명되는 프로세스들의 동작들은 문맥상 달리 지시되거나 또는 달리 명백하게 부정되지 않는 한 임의의 적절한 순서로 수행될 수 있다. 설명되는 프로세스들(또는 그 변형 및/또는 조합)은 실행 가능 명령어로 구성되는 하나 이상의 컴퓨터 시스템의 제어 하에서 수행될 수 있으며, 하나 이상의 프로세서 상에서, 하드웨어에 의해 또는 이들의 조합에 의해 총괄하여 실행되는 코드(예컨대, 실행 가능 명령어, 하나 이상의 컴퓨터 프로그램 또는 하나 이상의 애플리케이션)로서 구현될 수 있다. 코드는, 예를 들어, 하나 이상의 프로세서에 의해 실행 가능한 복수의 명령어를 포함하는 컴퓨터 프로그램 형태로 컴퓨터 판독 가능 저장 매체 상에 저장될 수 있다. 컴퓨터 판독 가능 저장 매체는 비일시적인 저장 매체일 수 있다.
제공되는 임의의 및 모든 예시, 또는 예시적인 언어(예컨대, "~와 같은")의 사용은, 달리 요청되지 않는 한, 단지 본 발명의 실시형태들을 보다 잘 설명하려는 것이지, 본 발명의 범위를 제한하려는 것이 아니다. 명세서의 어떤 언어도, 임의의 청구되지 않은 요소가 발명의 실시에 필수적인 것임을 나타내는 것으로 해석되지 않아야 한다.
본 개시물의 실시형태들은 발명을 실시하기 위해 발명자들에게 알려져 있는 최선의 형태를 포함하여 설명된다. 이들 실시형태의 변경은 전술한 설명을 숙독하면 당업자에게 명백해질 수 있다. 본 발명자들은 당업자가 이러한 변형을 적절히 채용할 것으로 기대하고, 또한 본 발명자들은 본 개시물의 실시형태들에 대하여 구체적으로 설명된 것과 다르게 실시되는 것을 의도한다. 따라서, 본 개시물의 범위는 적용 가능한 법률에 의해 허용되는 바와 같은, 여기에 첨부된 청구항들에서 인용되는 청구 대상의 모든 수정 및 등가물을 포함한다. 또한, 그 모든 가능한 변형에 있어서 전술한 요소들의 임의의 조합은 문맥상 달리 지시되거나 또는 달리 명백하게 부정되지 않는 한 본 개시물의 범위에 포함된다. 인용되는 공보, 특허 출원, 및 특허를 포함하는 모든 참고 문헌은 이로써 각각의 참고 문헌이 개별적으로 및 구체적으로 참조로 포함되는 것으로 지시되었고 전부 제시되었던 것처럼 동일한 정도로 참조로 포함된다.

Claims (18)

  1. 컴퓨터-구현 방법으로서,
    소스 코드의 일부를 입력으로서 수신― 상기 소스 코드의 일부는 고급 언어(high-level language)(HLL)로 작성됨 ―하는 단계; 및
    실행시에, 출력 스크립트가 상기 소스 코드의 일부에서 지정되는 기능을 적어도 부분적으로 제공하도록, 기능적으로 제한된 블록체인 스크립팅 언어로부터 선택되거나 및/또는 상기 기능적으로 제한된 블록체인 스크립팅 언어에 대하여 고유한 복수의 op_code를 포함하는 상기 출력 스크립트를 생성하는 단계를 포함하는
    방법.
  2. 제1항에 있어서,
    제1항에 기재된 단계들을 수행하도록 배열되는 컴파일러를 제공 또는 사용하는 단계를 포함하는
    방법.
  3. 제1항 또는 제2항에 있어서,
    상기 출력 스크립트는 정적 컴파일(static compilation)을 수행함으로써 생성되는
    방법.
  4. 제1항 내지 제3항 중 어느 한 항에 있어서,
    상기 블록체인 스크립팅 언어는 복잡한 제어 흐름 구문, 재귀 및/또는 점프 기반 루프를 기본적으로 지원하지 않도록 제한되는
    방법.
  5. 제1항 내지 제4항 중 어느 한 항에 있어서,
    상기 출력 스크립트를 생성하는 단계는:
    상기 소스 코드에 제공되는 적어도 하나의 루핑 구문(looping construct)을 언롤링(unrolling)하는 단계를 포함하는
    방법.
  6. 제1항 내지 제5항 중 어느 한 항에 있어서,
    상기 출력 스크립트를 블록체인 플랫폼 상에서 실행 가능한 형태로 변환하도록 배열되는 인터프리터(interpreter) 또는 가상 기계(virtual machine)를 제공 또는 사용하는 단계를 더 포함하는
    방법.
  7. 제1항 내지 제6항 중 어느 한 항에 있어서,
    보다 효율적인 또는 감소된 버전의 상기 출력 스크립트를 제공하도록 상기 출력 스크립트를 적어도 한 번 최적화하는 단계를 더 포함하는
    방법.
  8. 제1항 내지 제7항 중 어느 한 항에 있어서,
    상기 출력 스크립트를 생성하는 단계는 미분 없는 최적화(derivative free optimisation)의 사용을 포함하는
    방법.
  9. 제1항 내지 제8항 중 어느 한 항에 있어서,
    제1항 내지 제8항 중 어느 한 항에 기재된 단계들을 수행하도록 배열되는 상기 HLL 및/또는 컴파일러 컴포넌트는 소프트웨어 개발 키트(software development kit)(SDK)의 일부를 형성하는
    방법.
  10. 제1항 내지 제9항 중 어느 한 항에 있어서,
    상기 소스 코드는 스마트 계약(smart contract)을 구현하도록 배열되는
    방법.
  11. 제1항 내지 제10항 중 어느 한 항에 있어서,
    상기 HLL은 상기 블록체인 스크립팅 언어에 대하여 고유한 하나 이상의 프리미티브(primitive)로 직접적으로 변환될 수 있는 적어도 하나의 프리미티브 또는 구문을 포함하는
    방법.
  12. 제1항 내지 제11항 중 어느 한 항에 있어서,
    상기 블록체인 스크립팅 언어는 스택 기반이며, 상기 HLL은 상기 스크립팅 언어에 의해 사용되는 스택 상에서 연산을 수행하도록 배열되는 하나 이상의 프리미티브를 포함하는
    방법.
  13. 제1항 내지 제12항 중 어느 한 항에 있어서,
    상기 HLL은 상기 소스 코드에 대한 입력의 수를 상기 블록체인 스크립팅 언어에 의해 메모리 할당에 사용되는 스택 상으로 푸시하도록 배열되는 프리미티브를 포함하는
    방법.
  14. 제1항 내지 제13항 중 어느 한 항에 있어서,
    상기 HLL은 프리미티브들 또는 연산자들 또는 그 기능적 등가물 중 적어도 하나를 포함하며,
    상기 프리미티브들 또는 상기 연산자들 또는 상기 그 기능적 등가물은,
    Initiate;
    Declare;
    Increment;
    IF;
    While;
    Populate;
    Monus;
    Reset;
    Rawscript;
    Abort;
    Retrieve
    Hash, 해시 160, 또는 다른 해시 연산자 또는 그 변형을 포함하는
    방법.
  15. 컴퓨터-구현 방법으로서,
    소스 코드의 일부를 블록체인-호환 스크립트로 변환하기 위해 정적 컴파일을 사용하는 단계를 포함하며,
    상기 정적 컴파일은 루프 언롤링 단계를 포함하는
    컴퓨터-구현 방법.
  16. 제1항 내지 제15항 중 어느 한 항에 기재된 단계들을 구현하도록 배열되는 컴퓨터-구현 시스템.
  17. 제16항에 있어서,
    컴파일러를 포함하고, 상기 컴파일러는,
    소스 코드의 일부를 입력으로서 수신― 상기 소스 코드는 고급 언어(HLL)로 작성됨 ―하고;
    실행시에, 출력 스크립트가 상기 소스 코드에서 지정되는 기능을 적어도 부분적으로 제공하도록, 기능적으로 제한된 블록체인 스크립팅 언어로부터 선택되는 복수의 op_code를 포함하는 상기 출력 스크립트를 생성하도록
    배열되는
    시스템.
  18. 제16항 또는 제17항에 있어서,
    소프트웨어 개발 키트(SDK)를 포함하는
    시스템.
KR1020207001661A 2017-07-07 2018-07-05 블록체인 컴파일러 KR102608500B1 (ko)

Applications Claiming Priority (13)

Application Number Priority Date Filing Date Title
IBPCT/IB2017/054114 2017-07-07
GB1710971.1 2017-07-07
GB1710967.9 2017-07-07
IBPCT/IB2017/054113 2017-07-07
GB1710974.5 2017-07-07
IBPCT/IB2017/054110 2017-07-07
IB2017054110 2017-07-07
IB2017054114 2017-07-07
GBGB1710967.9A GB201710967D0 (en) 2017-07-07 2017-07-07 Computer-implemented system and method
IB2017054113 2017-07-07
GBGB1710974.5A GB201710974D0 (en) 2017-07-07 2017-07-07 Computer-implemented system and method
GBGB1710971.1A GB201710971D0 (en) 2017-07-07 2017-07-07 Computer-implemented system and method
PCT/IB2018/054971 WO2019008533A1 (en) 2017-07-07 2018-07-05 SYSTEM AND METHOD FOR COMPILING A HIGH-LEVEL LANGUAGE CODE IN AN EXECUTABLE SCRIPT ON A BLOCK CHAIN PLATFORM

Publications (2)

Publication Number Publication Date
KR20200021993A true KR20200021993A (ko) 2020-03-02
KR102608500B1 KR102608500B1 (ko) 2023-12-04

Family

ID=63077923

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020207001661A KR102608500B1 (ko) 2017-07-07 2018-07-05 블록체인 컴파일러

Country Status (8)

Country Link
US (9) US11797278B2 (ko)
EP (6) EP4328739A3 (ko)
JP (7) JP7317722B2 (ko)
KR (1) KR102608500B1 (ko)
CN (3) CN110869905B (ko)
SG (1) SG11201912227YA (ko)
WO (3) WO2019008531A1 (ko)
ZA (1) ZA201908552B (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102460351B1 (ko) * 2021-06-29 2022-10-31 주식회사 퓨처에셋파이넨셜 파일코인 채굴 생산성 향상 장치 및 방법, 이를 구현하기 위한 프로그램이 저장된 기록매체 및 이를 구현하기 위해 매체에 저장된 컴퓨터프로그램

Families Citing this family (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102608500B1 (ko) 2017-07-07 2023-12-04 엔체인 홀딩스 리미티드 블록체인 컴파일러
GB201811263D0 (en) * 2018-07-10 2018-08-29 Netmaster Solutions Ltd A method and system for managing digital using a blockchain
US12061452B2 (en) 2018-08-24 2024-08-13 Tyco Fire & Security Gmbh Building management system with blockchain ledger
US10964145B2 (en) * 2018-08-24 2021-03-30 Sensormatic Electronics, LLC Access control system using blockchain ledger
CN111949315A (zh) * 2019-05-16 2020-11-17 富士通株式会社 用于区块链账本数据的管理装置和方法
US11513815B1 (en) * 2019-05-24 2022-11-29 Hiro Systems Pbc Defining data storage within smart contracts
US11657391B1 (en) 2019-05-24 2023-05-23 Hiro Systems Pbc System and method for invoking smart contracts
US10699269B1 (en) 2019-05-24 2020-06-30 Blockstack Pbc System and method for smart contract publishing
US10783082B2 (en) * 2019-08-30 2020-09-22 Alibaba Group Holding Limited Deploying a smart contract
GB201913143D0 (en) * 2019-09-12 2019-10-30 Nchain Holdings Ltd Running a program from a blockchain
US11516147B2 (en) * 2019-10-02 2022-11-29 Red Hat, Inc. Blockchain-based dynamic storage provisioner
GB2604523A (en) * 2019-12-09 2022-09-07 Eris Digital Holdings Llc Electronic trading and settlement system for blockchain-integrated cryptographic difficulty-based financial instruments
US11314729B2 (en) * 2020-02-20 2022-04-26 International Business Machines Corporation Multi-candidate data structure for transaction validation
US20220066746A1 (en) * 2020-08-31 2022-03-03 Jpmorgan Chase Bank, N.A. Systems and methods for graphical programming and deployment of distributed ledger applications
CN113031931A (zh) * 2021-03-04 2021-06-25 嘉兴丰鸟科技有限公司 一种基于脚本交叉编译的Python安全扩展方法
US11902426B2 (en) * 2021-06-26 2024-02-13 Ceremorphic, Inc. Efficient storage of blockchain in embedded device
GB2618052A (en) * 2021-12-07 2023-11-01 Nchain Licensing Ag Blockchain script engine
US11658833B1 (en) 2022-12-06 2023-05-23 Citibank, N.A. Systems and methods for conducting cryptographically secure actions in public, non-permissioned blockchains using bifurcated self-executing programs
US11770263B1 (en) * 2022-12-06 2023-09-26 Citibank, N.A. Systems and methods for enforcing cryptographically secure actions in public, non-permissioned blockchains using bifurcated self-executing programs comprising shared digital signature requirements
CN118118444B (zh) * 2024-04-28 2024-07-12 之江实验室 一种基于可编程交换机的计算功能抽象方法及装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040015916A1 (en) * 2001-05-31 2004-01-22 Click Clifford N. System and method for loop unrolling in a dynamic compiler
US20140068576A1 (en) * 2012-08-30 2014-03-06 Sybase, Inc. Extensible executable modeling
WO2017024071A1 (en) * 2015-08-03 2017-02-09 PokitDok, Inc. System and method for decentralized autonomous healthcare economy platform
US9569206B1 (en) * 2015-09-29 2017-02-14 International Business Machines Corporation Creating optimized shortcuts

Family Cites Families (49)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0731603B2 (ja) * 1984-11-21 1995-04-10 ノビツクス Forth特定言語マイクロプロセサ
JPH01243162A (ja) * 1988-03-17 1989-09-27 Internatl Business Mach Corp <Ibm> プログラム供給方法
JP3032031B2 (ja) * 1991-04-05 2000-04-10 株式会社東芝 ループ最適化方法及び装置
US5774726A (en) * 1995-04-24 1998-06-30 Sun Microsystems, Inc. System for controlled generation of assembly language instructions using assembly language data types including instruction types in a computer language as input to compiler
US5761652A (en) 1996-03-20 1998-06-02 International Business Machines Corporation Constructing balanced multidimensional range-based bitmap indices
US6760905B1 (en) 2000-09-21 2004-07-06 Curl Corporation Lazy compilation of template-generated classes in dynamic compilation execution environments
US7168059B2 (en) 2001-04-20 2007-01-23 Bryan Darrell Bowyer Graphical loop profile analysis
JP4490084B2 (ja) * 2003-12-03 2010-06-23 安川情報システム株式会社 プログラム開発システムにおけるプログラム作成方法
JP2006107339A (ja) * 2004-10-08 2006-04-20 Matsushita Electric Ind Co Ltd プログラム処理装置
JP2008534955A (ja) 2005-03-31 2008-08-28 ジョージタウン ユニバーシティ 質量分析法による有利サイロキシンおよび遊離トリヨードサイロニン分析
CN100487652C (zh) * 2005-04-02 2009-05-13 华为技术有限公司 脚本语言的自动机方法
US7861222B2 (en) * 2007-06-13 2010-12-28 Microsoft Corporation Discoscript: a simplified distributed computing scripting language
JP5179822B2 (ja) * 2007-09-27 2013-04-10 株式会社日立ソリューションズ 携帯電話、携帯電話スクリプト開発・実行システム
US8533666B2 (en) * 2008-10-17 2013-09-10 Microsoft Corporation Interactive design environments to visually model, debug and execute resource oriented programs
US8370811B2 (en) * 2009-07-16 2013-02-05 Accenture Global Services Limited Modularizing and aspectizing graphical user interface directed test scripts
US10466989B2 (en) * 2011-09-02 2019-11-05 Microsoft Technology Licensing, Llc. Fast presentation of markup content having script code
CN102999370A (zh) * 2011-09-16 2013-03-27 腾讯科技(深圳)有限公司 脚本的执行方法及系统
US8997070B2 (en) * 2011-12-15 2015-03-31 Sap Se Extension mechanism for scripting language compiler
US10417314B2 (en) * 2012-06-14 2019-09-17 Open Text Sa Ulc Systems and methods of a script generation engine
WO2014022326A1 (en) * 2012-07-31 2014-02-06 Microsoft Corporation Multilingual build integration for compiled applications
US9152400B2 (en) 2013-04-18 2015-10-06 Facebook, Inc. Eliminating redundant reference count operations in intermediate representation of script code
US9684499B2 (en) 2013-06-30 2017-06-20 Dropbox, Inc. Systems and methods for facilitating installation of software applications
KR102156371B1 (ko) 2013-11-27 2020-09-15 한국전자통신연구원 네이티브 빌드 기반의 임베디드 소프트웨어 개발 환경을 지원하기 위한 임베디드 소프트웨어 개발 도구 제공 방법 및 장치
CA3128834C (en) * 2015-01-02 2023-11-14 Systech Corporation Control infrastructure
CN104484192B (zh) * 2015-01-07 2017-11-14 南威软件股份有限公司 一种复杂多分支结构代码自动生成的方法
US9892021B2 (en) 2015-03-18 2018-02-13 Sap Se Injection of code modifications in a two session debug scripting environment
US10812274B2 (en) * 2015-05-07 2020-10-20 Blockstream Corporation Transferring ledger assets between blockchains via pegged sidechains
US9735958B2 (en) 2015-05-19 2017-08-15 Coinbase, Inc. Key ceremony of a security system forming part of a host computer for cryptographic transactions
US20160342977A1 (en) * 2015-05-20 2016-11-24 Vennd.io Pty Ltd Device, method and system for virtual asset transactions
WO2017004527A1 (en) 2015-07-02 2017-01-05 Nasdaq, Inc. Systems and methods of secure provenance for distributed transaction databases
JP6547466B2 (ja) 2015-07-06 2019-07-24 富士通株式会社 コンパイラ装置、コンパイル方法およびコンパイラプログラム
US20170011460A1 (en) * 2015-07-09 2017-01-12 Ouisa, LLC Systems and methods for trading, clearing and settling securities transactions using blockchain technology
EP3125489B1 (en) * 2015-07-31 2017-08-09 BRITISH TELECOMMUNICATIONS public limited company Mitigating blockchain attack
US10473997B2 (en) 2015-08-07 2019-11-12 Kinestral Technologies, Inc. Electrochromic device assemblies
WO2017027071A1 (en) * 2015-08-13 2017-02-16 Intel IP Corporation Ciot architecture for efficient data transmission
EP3173962A1 (en) * 2015-11-25 2017-05-31 Gemalto Sa Method to generate a secure code
US11347838B2 (en) 2016-02-23 2022-05-31 Nchain Holdings Ltd. Blockchain implemented counting system and method for use in secure voting and distribution
AU2017240796A1 (en) * 2016-03-31 2018-10-25 Clause, Inc. System and method for creating and executing data-driven legal contracts
US10720232B2 (en) * 2016-04-13 2020-07-21 Accenture Global Solutions Limited Distributed healthcare records management
US10180900B2 (en) * 2016-04-15 2019-01-15 Red Hat Israel, Ltd. Recordation of user interface events for script generation
US11341484B2 (en) 2016-04-29 2022-05-24 Nchain Holdings Ltd. Implementing logic gate functionality using a blockchain
CN106296191A (zh) * 2016-08-13 2017-01-04 深圳市樊溪电子有限公司 一种区块链功耗感知的PoW共识机制
CN106598579B (zh) 2016-12-06 2020-12-25 北京果仁宝科技有限公司 区块链上集成动态类型编程语言方法和装置
CN106598549B (zh) 2016-12-08 2019-02-01 天津米游科技有限公司 一种基于区块链的智能合约系统及实现方法
CN106778343A (zh) * 2016-12-12 2017-05-31 武汉优聘科技有限公司 一种基于区块链的涉及隐私数据的数据共享方法
US10871948B1 (en) * 2017-03-30 2020-12-22 Wells Fargo Bank, N.A. Smart contract blockchain abstraction API
US10235280B2 (en) * 2017-04-10 2019-03-19 Fmr Llc Automated script creation and source code generation for testing mobile devices
US10963790B2 (en) 2017-04-28 2021-03-30 SparkCognition, Inc. Pre-processing for data-driven model creation
KR102608500B1 (ko) 2017-07-07 2023-12-04 엔체인 홀딩스 리미티드 블록체인 컴파일러

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040015916A1 (en) * 2001-05-31 2004-01-22 Click Clifford N. System and method for loop unrolling in a dynamic compiler
US20140068576A1 (en) * 2012-08-30 2014-03-06 Sybase, Inc. Extensible executable modeling
WO2017024071A1 (en) * 2015-08-03 2017-02-09 PokitDok, Inc. System and method for decentralized autonomous healthcare economy platform
US9569206B1 (en) * 2015-09-29 2017-02-14 International Business Machines Corporation Creating optimized shortcuts

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102460351B1 (ko) * 2021-06-29 2022-10-31 주식회사 퓨처에셋파이넨셜 파일코인 채굴 생산성 향상 장치 및 방법, 이를 구현하기 위한 프로그램이 저장된 기록매체 및 이를 구현하기 위해 매체에 저장된 컴퓨터프로그램

Also Published As

Publication number Publication date
US20240168735A1 (en) 2024-05-23
WO2019008532A1 (en) 2019-01-10
EP4328739A3 (en) 2024-04-03
JP7503670B2 (ja) 2024-06-20
US20200195442A1 (en) 2020-06-18
JP7535359B2 (ja) 2024-08-16
JP2023089127A (ja) 2023-06-27
JP2024096926A (ja) 2024-07-17
JP2020526814A (ja) 2020-08-31
CN110869905B (zh) 2024-08-13
EP4300290A2 (en) 2024-01-03
US20220350579A1 (en) 2022-11-03
US20230246811A1 (en) 2023-08-03
EP3649548A1 (en) 2020-05-13
US11868745B2 (en) 2024-01-09
EP4325351A2 (en) 2024-02-21
WO2019008533A1 (en) 2019-01-10
US20240231777A1 (en) 2024-07-11
KR102608500B1 (ko) 2023-12-04
US20230057419A1 (en) 2023-02-23
SG11201912227YA (en) 2020-01-30
JP7220678B2 (ja) 2023-02-10
EP3649759A1 (en) 2020-05-13
US20200174762A1 (en) 2020-06-04
CN110870249A (zh) 2020-03-06
JP2020526811A (ja) 2020-08-31
US20210081185A1 (en) 2021-03-18
CN110869906A (zh) 2020-03-06
US11416226B2 (en) 2022-08-16
CN110869905A (zh) 2020-03-06
US11307835B2 (en) 2022-04-19
JP2020526810A (ja) 2020-08-31
US20240211222A1 (en) 2024-06-27
US11941381B2 (en) 2024-03-26
EP3649547A1 (en) 2020-05-13
JP7476390B2 (ja) 2024-04-30
ZA201908552B (en) 2023-06-28
JP2023052782A (ja) 2023-04-12
EP4328739A2 (en) 2024-02-28
EP4325351A3 (en) 2024-04-03
JP2023100981A (ja) 2023-07-19
US11797278B2 (en) 2023-10-24
EP4300290A3 (en) 2024-02-21
WO2019008531A1 (en) 2019-01-10
US11922149B2 (en) 2024-03-05
JP7317722B2 (ja) 2023-07-31

Similar Documents

Publication Publication Date Title
KR102608500B1 (ko) 블록체인 컴파일러
JP7250178B2 (ja) ブロックチェーンネットワークにおけるスマートコントラクトをサポートするための方法及びコントラクト書き換えフレームワークシステム
Jiao et al. Semantic understanding of smart contracts: Executable operational semantics of solidity
Tikhomirov et al. Smartcheck: Static analysis of ethereum smart contracts
Grishchenko et al. Foundations and tools for the static analysis of ethereum smart contracts
CN112015628B (zh) 一种智能合约函数级动态监测分析系统及实现方法
Grishchenko et al. Ethertrust: Sound static analysis of ethereum bytecode
Shishkin Debugging smart contract’s business logic using symbolic model checking
Ahrendt et al. Smart contracts: a killer application for deductive source code verification
Schneidewind et al. The good, the bad and the ugly: Pitfalls and best practices in automated sound static analysis of ethereum smart contracts
Fontein Comparison of static analysis tooling for smart contracts on the evm
Chong et al. Building secure web applications with automatic partitioning
Zhukov et al. SmartGraph: Static Analysis Tool for Solidity Smart Contracts
Xi et al. A large‐scale empirical study of low‐level function use in Ethereum smart contracts and automated replacement
Xi et al. When they go low: automated replacement of low-level functions in ethereum smart contracts
CN114174983B (zh) 用于高级构造的优化的自动验证的方法和系统
Alhabardi et al. A model of Solidity-style smart contracts in the theorem prover Agda
He et al. Neural-FEBI: Accurate function identification in Ethereum Virtual Machine bytecode
US20210026608A1 (en) Compile time validation of programming code
Monteiro A study of static analysis tools for ethereum smart contracts
Lotfi Takami A reduction from smart contract verification to model checking
Sharkey Probabilistic proof-carrying code
Li et al. Formal Methods and Software Engineering: 24th International Conference on Formal Engineering Methods, ICFEM 2023, Brisbane, QLD, Australia, November 21–24, 2023, Proceedings
Han et al. Ethchecker: a context-guided fuzzing for smart contracts
Veschetti et al. SmartML: Enhancing Security and Reliability in Smart Contract Development

Legal Events

Date Code Title Description
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant