투표 과정은 어떻게 실행됩니까?

투표 과정은 어떻게 실행됩니까?

ChronoBank

ChronoBank 개발 팀은 투표에 대한 비용을 줄이고 투표 계약을 배치하는 방법을 설명합니다.

ChronoMint는 기능의 일부인 투표를 실행할 수 있는 기능을 제공합니다.이것은 생태계 핵심 전략 결정에 필요한 도구입니다.

블록체인에서 생성된 투표는 다음과 같은 요구 사항을 충족해야 합니다.

보안

신뢰성

투표를 운영을 위한 가격 (생성, 투표하기, 마감)

이상적인 투표 하위 시스템을 위한 첫 번째 단계는 투표 및 관리와 관련된 모든 업무를 수행하는 몇 가지 계약 (이하 관리자로 함)을 작성하는 것이었습니다. 모든 종류의 관리자를 위해 스토리지에 데이터를 보관하는 것이 특별한 계약인 StorageManager를 사용한다는 점을 언급할 필요가 있습니다.

📌 StorageManager는 저장 영역에 대한 접근을 허용하거나 거부할 수 있습니다.

투표에 대해서 다시 말하면, 이러한 계약이 공통 저장 공간을 공유하고 공유 변수에 접근이 있을 것입니다. 한편으로는 투표 프로세스를 몇 가지 기능적 계약 (세부 정보 얻기, 투표 자체, 투표 데이터 운영)으로 분리하고 방대한 규모의 코드를 더 작은 계약으로 분해할 수 있습니다. 그러나 다른 한편으로는, 이 간계는 모든 계약을 묶고 그 사이의 상태를 공유합니다. 올바른 방식으로 변경하기가 어려워집니다. 앞서 언급한 단점 외에도 이 구현은 투표에 대한 비용이 크고 많은 통계 데이터를 저장해야 했습니다. 우리는 이 모든 투표관련 것을 기대하지 않았습니다. 우리는 사용자가 쉽고 완전히 참여하는 생태계의 일부가 되기를 원합니다.

이전 투표 진행과 관련 일부 행동에 대한 가스 가격:


투표 생성 - 787111

투표하기 - 411641

투표 마감 - 482976

투표 삭제 - 95073

보시다시피 이것은 우수한 수치는 아니고 많은 개선의 여지가 있습니다 ...그래서 우리는 새로운 투표 방식을 위해 다른 접근 방법을 사용하기로 결정했습니다. 이전에는 시스템에서 투표를 만들고 일반 정보를 얻고 운영하기 위해 하나의 계약 (VotingsManager)을 남겨 둡니다. 이것은 투표를 사용하기로 결정하는 모든 사용자의 진입 점이 될 것입니다.하지만 가장 흥미로운 부분은 다음과 같습니다. 공유 범위에서 투표를 속성 집합으로 저장하는 대신 각 투표를 위해 완전 새로운 계약을 만들 것입니다.

📌 이러한 움직임은 많은 논리를 개별 계약으로 리팩터링하고, 계약을 단순화하며, 의도를 명확하게 할 수 있게 할 것입니다.

우리를 혼란스럽게 한 것은 투표를 시작할 때마다 이전 구현보다 계약 구축배치에 더 많은 가스를 필요하는 새로운 계약을 만듭니다.

완전 새로운 계약 내부에 많은 논리와 코드가 포함되어 있기 때문입니다.이 문제에 대한 우리의 결정은 모든 논리를 단일 계약 (백엔드라고 함)으로 재배치하여 한번 배포하고 투표를 생성할 때 완전한 기능적 투표 계약 대신 새로운 프록시 계약을 체결하는 것이었습니다.

생성된 프록시 계약에는 백엔드 계약 주소가 있으며 모든 호출을 해당 인스턴스로 리디렉션할 것입니다. 프록시 계약은 호출자 계약 (즉, 프록시)의 컨텍스트 내에서 위임 함수를 실행하는 _delegatecall_ 어셈블리 명령어로 쉽게 구현될 수 있으며 읽기/쓰기 조작은 해당 값을 컨텍스트와 연관시킬 것입니다. 이러한 모든 장점에도 불구하고 _delegatecall_에서 특정 값과 단어 코드 없이 여러 개 반환할 수 없으므로 프록시 계약에서 다중 반환 함수를 구현해야 했습니다. Byzantium 업데이트 덕분에 _returndatasize_ 및 _returndatacopy_라는 매우 편리하고 유용한 어셈블리 명령어가 추가되었습니다. 이 명령어는 위임 함수의 반환 데이터 크기와 반환 값을 반환하고 반환 데이터를 메모리에 복사합니다. 이제 우리는 그의 신청을 위한 좋은 장소를 찾아 낼 수 있었습니다. 우리는 프록시 계약에서 이를 사용할 수 있으며 백엔드 기능의 모든 세부 사항에서 코드를 정리할 수 있었습니다. 그 후에 우리는 새로운 투표가 만들어질 때마다 계약을 만들 것입니다. 거의 빈 계약을 배치하기 위해서는 소량의 가스가 필요할 것입니다.

이러한 변경 중에 동일한 행동에 대한 가스 가격:


투표 생성 - 849476

투표 하기- 159331

투표 마감 - 443473

투표 삭제 - 56486

보시다시피 투표 작업을 수행하는 동안 비용이 거의 3 배 적습니다. 이것은 상당한 규모로 사용자를 위한 많은 자원을 절약할 것입니다.여론 투표에서 여전히 약간의 증가가 있었지만 그것은 '투표'운영을 줄이기 위한 적절한 가격이었습니다. 투표를 마감하고 삭제하는 것과 같은 다른 방법도 가스 소비를 줄입니다.

투표 하위 시스템 배치:

v.1: 3089834 + 3789833 + 2891094 = 9.770.761

v.2: 2440890 + 586243 + 3014376 = 6.041.509



Report Page