본문으로 건너뛰기

Locus Core Script

Atomic Swap과 같은 가장 기본적인 Script를 로커스체인의 Core layer에서 실행 가능하도록 한다.
로커스체인의 Core layer에서 실행 가능하다는 것은, 처리가 가벼워서 모든 일반 Node가 일반 Tx를 처리하는 수준(혹은 약간 상회)으로 실행 가능하다는 것을 의미한다.

Data Types

타입설명
uint8uint8
uint16uint16
uint32uint32
uint64uint64
int8int8
int16int16
int32int32
int64int64
npknormal public key
nsignnormal signature
roundround
heightheight of account chain
digest32 bytes hash (blake2b256)
addressaddress of account
currencyamount of coin or token
summaryexample data type for data trading

OP Codes

op codeoperand 1operand 2description
#verconst uint16-operand1을 취해서 vm version을 검사.
#txa1data type-TxProvideScript와 TxAcceptScript의 Args[0]의 데이터 타입을 지정.
#txa2data type-TxProvideScript와 TxAcceptScript의 Args[1]의 데이터 타입을 지정.
#txa3data type-TxProvideScript와 TxAcceptScript의 Args[2]의 데이터 타입을 지정.
#txa4data type-TxProvideScript와 TxAcceptScript의 Args[3]의 데이터 타입을 지정.
op0, push_false--스택에 0을 push 한다. (1 byte)
op1, push_true--스택에 1을 push 한다. (1 byte), 1만이 유일한 TRUE 값.
op2 ~ op16--스택에 2 ~ 16을 push 한다. (1 byte)
ver--스택에서 1 byte를 pop하여, verify 한다.값이 1이면 mark를 true로 세트하고 스크립트를 종료. 다른 값이면 mark는 false가 됨.
ret--mark를 false로 세트하고 스크립트를 종료.
if--스택에서 1 byte를 pop하여, 값이 1이면 IF절을 수행한다. 값이 1이 아니고, else 절이 존재하면 else 절을 수행. if 구문은 중첩가능.
ifn--스택에서 1 byte를 pop하여, 값이 1이 아니 면 if 절을 수행한다.값이 1이고, else 절이 존재하면 else 절을 수행.
else--if 절의 끝, else 절의 시작.
eif--if 절 혹은 else 절의 끝.
push_txr1--TxProvideScript의 Round 값을 스택에 push.
push_txr2--TXAcceptScript의 Round 값을 스택에 push.
push_txh1--TxProvideScript의 Height 값을 스택에 push.
push_txh2--TXAcceptScript의 Height 값을 스택에 push.
push_txa1--Tx의 Arg[0]의 값을 스택에 push. 이 opcode를 수행하기 전에 #txa1으로 data type이 지정되어 있어야 함.
push_txa2--Tx의 Arg[1]의 값을 스택에 push. 이 opcode를 수행하기 전에 #txa2으로 data type이 지정되어 있어야 함.
push_txa3--Tx의 Arg[2]의 값을 스택에 push. 이 opcode를 수행하기 전에 #txa3으로 data type이 지정되어 있어야 함.
push_txa4--Tx의 Arg[3]의 값을 스택에 push. 이 opcode를 수행하기 전에 #txa4으로 data type이 지정되어 있어야 함.
hash_sha--스택에서 data를 pop 해서, sha256으로 해시값을 계산하여 스택에 push.
hash_blake--스택에서 data를 pop 해서, blake2b256으로 해시값을 계산하여 스택에 push.
root_summary--스택에서 summary를 pop 해서, summary의 root를 계산하여 스택에 push.
equ--스택에서 data를 두번 pop 해서 비교한 결과가 같으면 push_true를, 다르면 push_false 함.
neq--스택에서 data를 두번 pop 해서 비교한 결과가 다르면 push_true를, 같으면 push_false 함.
lt--스택에서 data를 두번 pop 해서 1st pop < 2nd pop 이면 push_true를, 아니면 push_false 함.
lte--스택에서 data를 두번 pop 해서 1st pop <= 2nd pop 이면 push_true를, 아니면 push_false 함.
gt--스택에서 data를 두번 pop 해서 1st pop > 2nd pop 이면 push_true를, 아니면 push_false 함.
gte--스택에서 data를 두번 pop 해서 1st pop >= 2nd pop 이면 push_true를, 아니면 push_false 함.
dup--스택의 최상위의 data와 같은 data를 스택에 push 함. (복사한다) (stack : x, ... → x, x, ...)
drop--스택에서 data를 pop 해서, 버림. (stack : x, y, ... → y, ...)
swap--스택에서 data를 두번 pop 해서, 교차해서 push 함. (stack : x, y, ... → y, x, ...)
rot--스택에서 최상위 data 3개를 rotate 시킴. (stack : x, y, z, ... → z, x, y, ...)
over--스택 최상위에서 두번째 data를 최상위에 복사함. (stack : x, y, ... → y, x, y, ...)
add--스택에서 data를 두번 pop 해서 더한 결과를 push 함. (type이 다르면 에러를 돌림)

Samples

Hashed Time Lock

TxProvideScript :
Target : // coin 을 받을 계정
TargetAfterTimeLock : // provider 자기 자신
Args[0] : // hash of seed
ScriptProvide :
#ver 1
#txa1 digest
push_txa1 // hash of seed
ret
ScriptAccept :
#ver 1
#txa1 digest
push_txa1 // seed
hash_blake // make hash of seed
equ // compare provider's hash & acceptor's hash
ver

TxAcceptScript :
Args[0] : // seed