컨트랙트 메타데이터

Solidity 컴파일러는 현재 컨트랙트에 대한 정보를 포함하고 있는 컨트랙트 메타데이터 JSON파일을 자동적으로 생성합니다. 이 파일을 사용하여 컴파일러 버전, 사용된 소스, ABI와 NatSpec 문서를 질의하여 보다 안전하게 컨트랙트와 상호작용하고 소스코드를 검증 할 수 있습니다.

이 컴파일러는 메타데이터 파일의 Swarm 해시를 각 컨트랙트의 byte코드 (자세한 내용은 아래를 참조) 끝에 추가하므로 중앙 집중식 데이터 공급자가 없어도 인증된 방식으로 파일을 검색 할 수 있습니다.

다른 사용자가 액세스 할 수 있도록 Swarm(또는 다른 서비스)에 메타데이터 파일을 게시해야 합니다. ContractName_meta.Json 라 불리는 파일을 생성하는 solc --metadata 명령어를 사용하여 파일을 만듭니다. 이 파일에는 소스코드에 대한 Swarm 참조가 포함되어 있으므로, 모든 소스파일과 메타데이터 파일을 업로드 해야 합니다.

메타데이터 파일은 다음과 같은 형식을 가집니다. 아래의 예제는 사람이 읽을 수 있는 방식으로 제공됩니다. 적절한 형식의 메타데이터는 따옴표를 올바르게 사용해야 하고, 공백을 최소한으로 줄이며 모든 객체의 키를 고유한 형식으로 정렬해야 합니다. 주석은 사용할 수 없습니다. 여기서는 오로지 설명의 목적으로 사용되었습니다.

{
  // 필수 : 메타데이터 형식의 버전
  version: "1",
  // 필수 : 소스코드 언어는 기본적으로 사양의
  // "하위 버전(sub-version)"을 선택합니다.
  language: "Solidity",
  // 필수 : 컴파일러에 대한 세부사항, 내용은
  // 언어에 따라 다릅니다.
  compiler: {
    // Solidity에 필수 : 컴파일러의 버전
    version: "0.4.6+commit.2dabbdf0.Emscripten.clang",
    // 선택 사항 : 이 출력을 생성한 컴파일러 바이너리의 해시
    keccak256: "0x123..."
  },
  // 필수 : 컴파일 소스 파일 / 소스 유닛, 키는 파일 이름입니다.
  sources:
  {
    "myFile.sol": {
      // 필수 : 소스 파일의 keccak256 해시
      "keccak256": "0x123...",
      // 필수 ("content"를 사용하지 않는 한 아래를 참조) : 소스파일에
      // 정렬된 URL, 프로토콜은 다소 제멋대로지만, Swarm URL을
      // 권장합니다.
      "urls": [ "bzzr://56ab..." ]
    },
    "mortal": {
      // 필수 : 소스 파일의 keccak256 해시
      "keccak256": "0x234...",
      // 필수("url"을 사용하지 않는 한) : 소스 파일의 literal 내용 // TODO : Review needed
      "content": "contract mortal is owned { function kill() { if (msg.sender == owner) selfdestruct(owner); } }"
    }
  },
  // 필수 : 컴파일러 세팅
  settings:
  {
    // Solidity에 필수 : 재맵핑의 정렬된 목록 // TODO : Review needed
    remappings: [ ":g/dir" ],
    // 선택 사항 : 최적화 설정 (기본값 : false)
    optimizer: {
      enabled: true,
      runs: 500
    },
    // Solidity에 필수 : 이 메타데이터가 작성된
    // 컨트랙트나 라이브러리의 파일과 이름
    compilationTarget: {
      "myFile.sol": "MyContract"
    },
    // Solidity에 필수 : 사용된 라이브러리의 주소
    libraries: {
      "MyLib": "0x123123..."
    }
  },
  // 필수 : 컨트랙트에 대한 생성된 정보
  output:
  {
    // 필수 : 컨트랙트의 ABI 정의
    abi: [ ... ],
    // 필수 : 컨트랙트의 NatSpec 사용자 문서
    userdoc: [ ... ],
    // 필수 : 컨트랙트의 NatSpec 개발자 문서
    devdoc: [ ... ],
  }
}

Byte코드에서 메타데이터 해시의 인코딩

앞으로 메타데이터 파일을 검색하는 다른 방법을 지원할 수 있기 때문에, 매핑 {"bzzr0": <Swarm hash>}CBOR <https://tools.ietf.org/html/rfc7049> 인코딩으로 저장됩니다. 인코딩의 시작부분을 찾기가 쉽지 않기 때문에, 길이가 2 바이트 빅엔디안 인코딩으로 추가됩니다. Solidity 컴파일러의 현재 버전은 배포된 byte코드의 끝에 다음을 추가합니다:

0xa1 0x65 'b' 'z' 'z' 'r' '0' 0x58 0x20 <32 bytes swarm hash> 0x00 0x29

따라서 데이터를 검색하기 위해, 배치된 byte코드의 끝을 검사하여 위의 패턴과 일치시키고 Swarm 해시를 사용하여 파일을 검색 할 수 있습니다.

자동 인터페이스 생성 및 NatSpec의 사용

메타데이터는 다음과 같은 방식으로 사용됩니다: 컨트랙트와 상호작용하려는 구성요소(예:Mist 혹은 지갑)는 검색된 파일의 Swarm 해시에서 컨트랙트의 코드를 검색합니다. 이 파일은 위와 같은 구조로 JSON으로 디코딩 됩니다.

구성요소는 ABI를 사용하여 컨트랙트에 대한 기본 사용자 인터페이스를 자동으로 생성 할 수 있습니다.

또한, Wallet은 NatSpec 사용자 문서를 사용하여 컨트랙트와 상호작용 할 때마다 트랜잭션 서명에 대한 승인 요청과 함께 사용자에게 확인 메세지를 표시 할 수 있습니다.

이더리움 Natural Specification (NatSpec) 에 대한 추가정보는 여기 에서 찾을 수 있습니다.

소스코드 검증 사용법

컴파일을 확인하기 위해, 메타데이터 파일의 링크를 통해 Swarm에서 소스를 검색 할 수 있습니다. 올바른 버전의 컴파일러("공식" 컴파일러의 일부로 확인 됨) 는 특별한 설정으로 해당 입력에서 호출됩니다. 결과 byte코드는 작성 트랜잭션 또는 CREATE opcode 데이터의 데이터와 비교됩니다. 이는 해시가 byte코드의 일부이기 때문에 메타데이터가 자동으로 증명됩니다. 잉여데이터는 생성자 입력데이터와 동일해야하며, 이는 인터페이스에 따라 디코딩되어 사용자에게 제공되어야 합니다.