Cadence에서 Go 코드로 변환 — Numio
WebAssembly로 컴파일된 easi-gen을 사용해 Flow Cadence 컨트랙트의 struct, resource, event에서 Go struct를 생성합니다. 필드에는 godence 인코더용 `godence:"..."` 태그가 붙고, String? 같은 옵셔널 타입은 일반 Go 타입이 됩니다.
flow-go-sdk와 godence를 쓰는 Go 백엔드에서 Flow 블록체인의 스크립트 결과나 컨트랙트 이벤트를 디코딩할 때.
Cadence types
Go types
이럴 때 사용하세요
- flow-go-sdk와 godence를 쓰는 Go 백엔드에서 Flow 블록체인의 스크립트 결과나 컨트랙트 이벤트를 디코딩할 때.
- 스크립트를 직접 작성하는 대신 컨트랙트의 공개 함수에 대한 쿼리 함수를 갖춘 타입 있는 Go 클라이언트를 생성할 때.
사용 방법
- Cadence types 편집기에 Cadence 컨트랙트를 붙여 넣습니다. 최상위 pub contract 블록은 남겨 두세요. 컨트랙트 밖의 struct는 거부됩니다.
- 필요하면 Output Settings를 열고 "Generate Interaction Code With Functions"를 켜서 package 헤더, import, ContractX 타입, pub fun마다 하나씩의 Go 메서드도 생성합니다.
- Go types 패널을 프로젝트에 복사하고 godence import를 추가합니다. 필드가 *big.Int를 쓰면 import "math/big"은 자동으로 추가됩니다.
Cadence 컨트랙트
pub contract Marketplace {
pub struct Listing {
pub let id: UInt64
pub let seller: Address
pub var price: UFix64
pub var tags: [String]
pub var meta: {String: String}
pub var note: String?
init() { self.id = 0; self.seller = 0x01; self.price = 0.0; self.tags = []; self.meta = {}; self.note = nil }
}
pub event Sold(id: UInt64, buyer: Address)
}Go struct
type StructListing struct {
Id uint64 `godence:"id"`
Seller string `godence:"seller"`
Price uint64 `godence:"price"`
Tags []string `godence:"tags"`
Meta map[string]string `godence:"meta"`
Note string `godence:"note"`
}
type EventSold struct {
Id uint64 `godence:"id"`
Buyer string `godence:"buyer"`
}세부 정보 및 제한 사항
생성은 전부 브라우저에서 실행됩니다. 페이지가 easi-gen WebAssembly 모듈을 불러오며 서버로는 아무것도 보내지 않습니다. 생성기는 페이지 스크립트에 포함된 큰(약 29 MB) WebAssembly 번들이라 첫 로드가 느릴 수 있습니다.
이름에는 종류별 접두사가 붙습니다: StructListing, ResourceNFT, EventSold. 필드 이름은 첫 글자가 대문자가 되고, 원래 Cadence 이름은 godence 태그에 유지됩니다.
실제 타입 매핑: UInt64 → uint64, Int8 → int8, Int → *big.Int, UFix64 → uint64, Fix64 → int64, Address → string, [T;2] → [2]T, {K:V} → map[K]V.
기본 설정에서는 package 줄 없이 타입 선언만 생성되며 pub fun 본문은 무시됩니다. 추가되는 import는 Int 필드에 *big.Int가 필요할 때의 "math/big"뿐입니다.
FAQ
"no top level contract found"가 나오는 이유는 무엇인가요?
생성기는 pub contract 안의 선언만 읽으므로 독립된 struct는 이 오류로 표시됩니다. 편집기 기본 예시처럼 pub contract Example { ... } 같은 컨트랙트 블록으로 감싸세요.
옵셔널 타입은 어떻게 처리되나요?
옵셔널 표시는 제거됩니다. String?은 string이 되고, Listing?을 반환하는 함수는 StructListing으로 매핑됩니다. nil 결과는 0 값으로 디코딩되므로 값 누락은 직접 확인하세요.
"Generate Interaction Code With Functions"는 무엇을 추가하나요?
package와 import 줄, 컨트랙트 주소를 확인하는 생성자가 있는 ContractName 타입, 그리고 공개 함수마다 메서드를 추가합니다. 각 메서드는 Cadence 스크립트를 만들고 ExecuteScriptAtLatestBlock을 실행한 뒤 godence로 결과를 디코딩합니다.
중첩 struct와 다차원 배열을 지원하나요?
네. 다른 struct 안에 선언된 struct는 별도의 Go 타입이 되고, [[String]]은 [][]string이 되며, 중첩된 딕셔너리는 map[string]map[string]string 같은 중첩 map이 됩니다.