구조체 타입에 대해서 사용할 함수와 함께 구조체타입을 정의할 수 있는 라이브러리다.
구조체 타입은 Moves의 전역 스토리지의 스키마를 정의하고, 모듈 함수들로 스토리지를 업데이트하는 규칙들을 정의한다. 모듈 자체적으로도 전역 스토리지에 저장할 수 있다.
기존 언어들의 main
함수처럼 실행가능한 진입지점(entrypoints)이다. 스크립트는 전역 스토리지의 업데이트를 수행하는 배포된 모듈의 함수를 실행한다. 스크립트는 전역 스토리지에 배포되지 않은 일시적인 코드 스니펫이다.
[형식]
script {
<use>
<constants>
fun <identifier><[type parameters: constraint]*>([identifier: type]*) <function_body>
}
스크립트는 friends
나, 구조체 타입을 선언할 수 없고, 전역 스토리지에 접근할 수 없다. 그저 모듈 함수만 실행시키는 목적으로 쓰인다.
[형식]
module <address>::<identifier> {
(<use> | <frient> | <type> | <function> | <constant>)*
}
\<address>는 유효한 이름이거나 리터럴 address 형식이다.
module 0x42::test
라고 명시한다면, 해당 모듈 test
는 전역 스토리지의 0x42
게정 주소로 배포되어진다.
모듈은 또한 명명된 address를 이용하여 선언되어질 수 있다. (ex) module test_addr::test
)
명명된 address는 컴파일 단계에서 소스 언어 수준에서만 존재하기 때문에, 명명된 address는 바이트코드 수준에서 값이 완전히 대체되어진다. 밑의 코드로 my_addr
에 0xCOFFEE
를 설정해줄 수 있다.
[script 코드]
script {
fun example() {
my_addr::m::foo(@my_addr);
}
}
하지만 source level 에서는, 저런 식으로 작동하지 않는다. m::foo
함수는 무조건 my_addr이라는 명명된 address로 접근이되어져하지, 숫자로 표현되어 있는 할당된 주소값을 통해서 접근하지 않는다.
모듈 이름은 알파벳 대소문자, 밑줄(_
) 그리고 숫자로 구성되어진다.