본문으로 건너뛰기

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 클라이언트를 생성할 때.

사용 방법

  1. Cadence types 편집기에 Cadence 컨트랙트를 붙여 넣습니다. 최상위 pub contract 블록은 남겨 두세요. 컨트랙트 밖의 struct는 거부됩니다.
  2. 필요하면 Output Settings를 열고 "Generate Interaction Code With Functions"를 켜서 package 헤더, import, ContractX 타입, pub fun마다 하나씩의 Go 메서드도 생성합니다.
  3. 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이 됩니다.

사양 및 참고 자료