LLVM을 사용하여 ETC 스마트 컨트랙트 언어 만들기 – 컴파일러구현 변경

EVM 관련 헤더

완전한 기능을 갖춘 EVM 스마트 컨트래그를 만들기 위해서는 CALLDATALAD, RETURN과 같은 일부 EVM별 작업에 액세스해야 합니다. EVM별 지침은 내재된 기능을 사용하여 컴파일러 개발자에게 내보내 집니다. 정의된 고유 함수에 액세스하려면 EVM 고유 함수 선언을 포함해야 합니다.


#include "llvm/IR/IntrinsicsEVM.h"

256비트 정수 지원

다른 소수점 데이터 유형은 다른 컴퓨터에서 다른 소수점 계산 결과가 나와 체인의 포크가 발생할 수 있기 때문에 블록체인에 허용되지 않습니다. 그러므로 통합형으로 전화되어야 합니다. 이 경우 EVM-LLVM에서 256비트 정수를 지원하고 사례를 소개하고자 합니다.


LLVM에서 임의 길이의 정수는 다음과 같이 LLVM::APlnt를 사용해 저장됩니다. 256비트 정수를 만들기 위해서는 다음을 호출하면 됩니다.


Value* int256 = ConstantInt::get(TheContext, APInt(256, "1234567890123456789", 10));

256비트 정수를 보다 쉽게 구체화할 수 있도록 함수에 랩을 추가할 수 있습니다.


static Value* Get256ConstantInt(int64_t val) {
  return ConstantInt::get(TheContext, APInt(256, val));
}

우리의 작은 언어에서, 우리는 NumberExprAST을 std::string 아닌 int64_t구조로 개선했습니다. 이를통해 우리는 nt64_t의 4배 크기인 256비트 정수를 처리할 수 있습니다.


class NumberExprAST : public ExprAST {
  std::string Val;
public:
  NumberExprAST(std::string Val) : Val(Val) {}
  Value *codegen() override;
};Value *NumberExprAST::codegen() {
  return ConstantInt::get(TheContext, APInt(256, Val, 10));
}

여기서 우리는 256비트 정수를 정확하게 해석하기 위해 중첩된 문자열 스타일 APInt 구조 함수를 사용했다는 점에 유의하십시오.


2 views

Recent Posts

See All

ETC 피닉스 하드포크 업데이트 6월 1일 진행 예정

이더리움 클래식 메인넷은 다가오는 10.500.839블록에서 피닉스 하드포크를 활성화합니다. 예상 시점은 2020년 6월 1일입니다. 이번 하드포크는 아틀란티스, 아가타에 이어 이더리움 클래식의 세 번째 업그레이드입니다. 피닉스 하드포크 이후 이더리움 클래식과 이더리움은 완벽하게 호환되며 동일한 기능을 갖게 됩니다. 이번 하드포크의 주요 목표는 이더리움 이

LLVM을 사용하여 ETC 스마트 컨트랙트 언어 만들기 - 기타주제

LLVM IR 코드 생성 allocatea 명령은 현재 기능의 메모리 프레임에 32바이트 프레임 객체(기능-로컬 객체)를 할당. 메모리 공간 인덱싱 보통 EVM 스마트 계약 ABI 정보를 내보내는 것은 언어에 달려 있다. 하지만 우리는 계약서 ABI를 방출하기 위해 LLVM IR 패스를 작성할 수 있다. 제한 사항 EVM은 결정적 실행을 위해 설계되었습니다