>기술 주변기기 >IT산업 >견고성 함정 : 이더 리움의 무작위 생성

견고성 함정 : 이더 리움의 무작위 생성

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌원래의
2025-02-16 10:44:09659검색

Solidity Pitfalls: Random Number Generation for Ethereum 이 기사는 Iolite가 후원하고 만들어졌습니다. Sitepoint를 가능하게 한 파트너를 지원해 주셔서 감사합니다.

견고성은 코드와 관련된 문제와 완벽한 코드가 없기 때문에 의도 된 사용을 포함하는 비교적 새로운 언어입니다. 이 기사는 임의의 숫자를 이더 리움 스마트 계약에 입력 할 때 모범 사례와 함정을 안내합니다.

키 포인트

견고성 언어 자체는 결정 론적 특성과 복잡한 알고리즘의 높은 비용으로 인해 실제 임의 숫자를 생성 할 수 없습니다. 개발자는 경우에 따라 공격자가 결과를 예측할 수 있음을 알고 있어야합니다.

견고성에서 의사 랜덤 숫자를 생성하는 일반적인 방법은 LCG (Linear Congruence Generator) 알고리즘을 사용하는 것입니다. 그러나 비밀번호 보안 응용 프로그램에는 효과가 없으며

에 의존하여 광부는 이러한 값을 조작 할 수 있습니다. ChainLink VRF (검증 된 랜덤 함수)는 견고성에서 입증 된 랜덤 숫자를 생성하는 솔루션을 제공합니다. 숫자가 진정으로 랜덤 숫자인지 확인하기 위해 체인 임의성 검사 및 비밀번호 믹싱을 사용합니다. 랜덤 숫자를 생성하기위한 다른 메커니즘에는 다음이 포함됩니다 현명한 계약.

  • 견고성 임의 번호 생성
  • 견고성은 임의의 숫자를 생성 할 수 없습니다. 실제로, 임의의 숫자를 생성하는 모든 알고리즘은 의사 랜덤입니다. 언어는 완전히 무작위 숫자를 생성 할 수 없습니다. 견고성 문제는 복잡한 알고리즘이 너무 비싸서 더 기본적인 솔루션이 사용된다는 것입니다. 그 외에도, 견고성 코드는 여러 노드에서 실행되므로 결정적이어야합니다. 한 번에 난수를 생성하고 여러 노드에서 사용할 수있는 알고리즘이 필요합니다. 임의의 숫자를 생성하는 데 클럭 시간과 같은 정보를 사용할 수 없으므로 다른 옵션을 찾아야합니다. 개발자는 공격자가 특정 상황에서 결과를 예측할 수 있기 때문에이 문제를 알고 있어야합니다.
  • 가장 일반적으로 사용되는 알고리즘 중 하나는 "선형 합동 생성기"(LCG)입니다. 가장 오래된 알고리즘 중 하나이며 빠르고 이해하기 쉽습니다. LCG는 메모리가 제한되어 있기 때문에 임베디드 시스템에 적합한 선택입니다. 그러나 비밀번호 보안 응용 프로그램에서는 작동하지 않습니다. 그럼에도 불구하고 빠른 알고리즘은 가스 비용 측면에서 저렴하기 때문에 여전히 스마트 계약에 사용됩니다. block.timestamp 알고리즘 자체는 다음 단계를 수행합니다 block.difficulty 입력을 허용 입력에서 알고리즘을 실행하십시오
      출력 모듈러스를 얻으십시오 (원하는 범위의 최대 수로 나뉩니다) 출력 0이 원하는 범위의 최대 숫자 사이의 값으로 0으로
    • 복권 스마트 계약 예제를 사용하여 임의의 숫자를 생성하는 다양한 방법을 살펴 보겠습니다. 사용자는 계약에 0.1 에테르를 보내고 0에서 250 사이의 정수를 보내서 복권에 가입 할 수 있습니다.
      1. & block.timestamp block.difficulty

      2. 광부가 트랜잭션을 확인할 때마다 a
      가 할당됩니다. 복권 계약의 선수는 그것을 통제 할 수 없습니다. 임의의 숫자를 만드는 데 사용되는이 코드를 살펴 보겠습니다.

      block.timestamp

      여기에서 gist를 찾으십시오.
      <code class="language-solidity">function random() private view returns (uint8) {
        return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251);
      }</code>
      이 코드는 먼저 블록 타임 스탬프와 난이도를 해시합니다. 다음으로 해시 값을 정수로 변환하고 0에서 250 사이의 정수를 얻기 위해 251로 나눕니다. 그러나이 코드의 문제점은 광부가 승자를 선택하도록 신뢰해서는 안된다는 것입니다.

      복권 입력 - 데이터

      우승자를 선택하려면 더 임의의 데이터가 필요합니다. 우리는 복권 스마트 계약에 들어간 플레이어의 주소를 사용할 수 있지만, 남용 할 수 있기 때문에 숨겨야합니다. 모든 정보는 블록 체인에 기록되어 있으므로이 정보는 숨길 수 없습니다.

      복권 스마트 계약에 제출할 수있는 숫자. 사용자에게는 이더 리움 주소로 선택한 해싱 번호가 있어야합니다. 이것은 우리에게 꽤 임의의 숫자를줍니다.
      1. 체인 링크 vrf

      2. 이 말하면 무작위성이 가능하지만 블록 체인 외부에서 임의의 숫자를 얻으려면 오라클을 사용하면됩니다. 외부 데이터를 사용하는 데있어 문제는 숫자가 실제로 무작위임을 증명하기가 매우 어렵고 오프 체인 엔티티가 어떤 식 으로든 임의의 숫자를 조작하지 않도록하는 것입니다. ChainLink VRF가 작동하는 곳입니다. ChainLink VRF (검증 된 랜덤 함수)는 견고성에서 입증 된 임의의 숫자를 얻는 방법입니다.
      체인 링크 vrf는 체인 링크 노드가 이벤트를 읽고 난수를 반환하는 블록 체인에 이벤트를 추가합니다. 온쇄 임의성 검사는 소위 VRF 코디네이터를 통해 수행됩니다. 이것은 Oracle의 특정 키 해시와 사용자의 시드 문구와 일부 암호화를 사용하여 숫자가 실제 임의 숫자인지 확인합니다. 이런 식으로, 우리는 편견없는 임의의 숫자를 얻을 수 있습니다.

      기타 메커니즘

      1. 4.1 이더 리움 알람 시계 개발자는 당첨자를 선택할 때 고려해야합니다. 코드는 여러 노드에서 다른 시간에 실행되므로 Clock Time과 같은 정보는 이더 리움 가상 머신에서 사용할 수 없습니다. 따라서 승자를 선택하기가 더 어렵습니다. 한 가지 방법은 스마트 계약에서 복권을 끄고 승자를 선택하는 기능을 구현하는 것입니다. 이것은 우리가 기대했던 것만 큼 분산되지 않았습니다. 계약의 소유자는 친구가 이길 것이라고 판단 할 때 복권을 폐쇄 할 수 있습니다. 우리는 이런 종류의 부정 행위를 피해야합니다.

        더 나은 옵션은 이더 리움 알람 시계를 사용하는 것입니다. 이더 리움 블록 체인에서 나중에 트랜잭션을 예약 할 수있는 서비스입니다. 이 서비스는 완전히 신뢰할 수 없으므로 전체 서비스가 스마트 계약으로 실행됩니다. 기본적으로 이더 리움 알람은 블록 번호를 사용하여 거래를 예약합니다. 이것이 계약이 자체적으로 시작한다는 것을 의미하지는 않습니다. "Select Winner"기능 (Ether Reward)에 대한 사용자의 관심에 의존합니다. 물론 아무도 당신의 기능을 부르지 않으면 복권이 실패합니다.

        4.2 랜덤 데이터 입력

        random.org는 JSON을 통해 랜덤 데이터 소스를 제공하는 API를 제공합니다. 이더 리움 스마트 계약은이 데이터 소스를 사용하여 임의의 숫자를 선택하기위한 알고리즘을 공급할 수 있습니다. 보안이 중요하기 때문에 디지털 서명을 사용할 수 있습니다. 랜덤 데이터는 random.org에 의해 서명됩니다. 데이터의 무결성을 확인하여 실제로 random.org에서 나와 데이터가 변조되지 않았 음을 증명할 수 있습니다.

        Randao는 블록 체인 필드의 새로운 프로젝트로, 임의의 숫자를 전적으로 제공하는 데 중점을 둡니다. 그들은 당신에게 임의의 숫자를 제공하기 위해 오라클과 스마트 계약의 조합을 사용합니다. 그러나 Randao 서비스는 현재 매우 느립니다. 자주 사용하는 앱이있는 경우 이상적이지 않습니다.

        4.3 블록 번호 모니터

        설정 한 대상 번호와 일치 할 때까지 블록 번호를 확인하는 코드에서 모니터를 사용할 수도 있습니다.

        소스. GIST <.>.

          4.4 Iolite Smart Contract Creation iolite는 스마트 계약을 만들기 위해 자연 언어를 수용하는 제품을 만들고 있습니다. FAE (Fast Adaptation Engine)라고 불리는 Stanford Natural Language Processing (NLP) 엔진을 사용합니다. Iolite는 지역 사회 교육을위한 견고성 전문가에 의존합니다. Solidity Expert (기고자)는 하나 이상의 문장을 포함하는 구조를 정의하고 해당 스마트 계약 코드에 추가 할 수 있습니다.

          Stanford NLP 엔진은 복잡한 언어를 이해하도록 설계되었습니다. 언어의 복잡성은 기계 훈련의 양에 따라 다릅니다. 적절한 교육 후 엔진은 복잡한 스마트 계약을 만들 수 있습니다. FAE는 복잡한 계약이 실제로 복잡하지 않기 때문에 그러한 계약을 창출 할 수 있습니다. 전문가들은 요청을 여러 개의 작은 코드 스 니펫으로 분할하여 문장으로 추가 할 수 있습니다.

          누군가가 여러 문장을 입력하면 "복잡한"계약을 구축하기 위해 해당 구조/문장을 찾습니다. 기고자들은 새로운 구조의 채굴 과정을 통해 Iolite 토큰 보상을 받게됩니다.

          iolite를 사용하는 장점은 스마트 계약 전문가가 무작위 숫자 생성과 같은 문제를 해결할 수 있다는 것입니다. iolite.io에서 자세한 정보를 찾을 수 있습니다.

          결론
          <code class="language-solidity">function random() private view returns (uint8) {
            return uint8(uint256(keccak256(block.timestamp, block.difficulty))%251);
          }</code>

          보시다시피, 진정한 임의의 입력을 생성하는 것은 쉽지 않습니다. 무작위성의 원천으로 , 및 에 의존하지 마십시오. 좋은 솔루션에는 여러 의사 랜덤 데이터 입력을 결합하고 Oracles 또는 Smart 계약을 사용하여보다 신뢰할 수 있도록하는 것이 포함됩니다. 스마트 계약에 입력 된 데이터를 아무도 변조 할 수 없도록 100% 확신해야합니다.

          임의의 숫자 생성 로직을 구현하기 전에 조심하고 두 번 생각하십시오.

          견고성에서 임의의 숫자 생성에 대한 FAQ (FAQ) 견고성에서 임의의 숫자를 생성하기가 어려운 이유는 무엇입니까? Solidity (이더 리움 스마트 계약을 작성하는 데 사용되는 프로그래밍 언어)에는 임의의 숫자를 생성하기위한 내장 기능이 없습니다. 이는 블록 체인 (이더 리움의 기본 기술)이 본질적으로 결정적이기 때문입니다. 이것은 입력 세트가 주어지면 출력이 항상 동일하다는 것을 의미합니다. 이 확실성은 블록 체인의 무결성과 보안을 유지하는 데 중요합니다. 그러나 무작위성의 개념이 본질적으로 비 결정적이기 때문에 실제 랜덤 숫자를 생성하는 것은 도전에 도전합니다. 견고성에서 랜덤 숫자를 생성하는 일반적인 방법은 무엇입니까?

          개발자는 여러 가지 방법을 사용하여 유사 랜덤 숫자를 견고하게 생성합니다. 일반적인 방법은 현재 블록 타임 스탬프 및 블록 난이도와 같이 입력이 예측하기 어려운 Keccak256 해시 함수를 사용하는 것입니다. 또 다른 접근법은 오프 체인 소스에서 임의의 숫자를 제공하는 Oracle 서비스를 사용하는 것입니다. 그러나 각 접근 방식에는 자체 한계와 잠재적 보안 위험이 있습니다.

          랜덤 숫자를 생성하기 위해 keccak256 해시 함수를 사용하는 위험은 얼마입니까?

          keccak256 해시 함수는 의사 랜덤 숫자를 생성하는 데 사용될 수 있지만 잠재적 인 보안 위험이 있습니다. 현재 블록 타임 스탬프 및 블록 난이도와 같은 해시 함수에 대한 입력은 블록 체인에서 공개적으로 사용할 수 있으므로 악성 광부는 이러한 값을 조작하여 임의의 숫자로 생성 된 출력에 영향을 줄 수 있습니다.

          Oracle Service를 사용하여 견고성에서 임의의 숫자를 생성하는 방법은 무엇입니까?

          원래 서비스는 오프 체인 소스에서 임의의 숫자를 제공 할 수 있습니다. 이 서비스는 블록 체인과 외부 세계 사이의 다리 역할을하므로 스마트 계약이 블록 체인 자체에 사용할 수없는 데이터와 상호 작용할 수 있습니다. 그러나 Oracle Services를 사용하면 스마트 계약이 정확하고 편견없는 임의의 숫자를 제공하기 위해 Oracles에 의존해야하기 때문에 신뢰 수준이 소개됩니다.

          약속-임의의 숫자를 생성 할 때 체계를 드러내는 역할은 무엇입니까?

          약속-반박 체계는 분산되고 안전한 방식으로 임의의 숫자를 생성하는 방법입니다. 약속-반박 체계에서 참가자는 먼저 비밀 번호를 커밋 한 다음 모든 비밀 수가 동시에 드러나고 이러한 비밀에 따라 임의의 수가 생성됩니다. 이 접근법은 단일 참가자가 임의의 숫자로 생성 된 출력에 영향을 미치지 못하게합니다.

          스마트 계약에서 실제 랜덤 숫자를 생성하는 것이 중요한 이유는 무엇입니까?

          실제 랜덤 숫자는 우연의 게임, 복권 및 임의성이 필요한 기타 응용 프로그램에 사용되는 것과 같은 많은 유형의 스마트 계약에 중요합니다. 이 계약에 사용 된 랜덤 숫자를 예측하거나 영향을 줄 수 있다면, 불공정 한 결과로 이어질 수 있으며 악의적 인 행위자가 계약을 이용할 수 있습니다.

          블록 하쉬 함수를 사용하여 견고성에서 랜덤 숫자를 생성 할 수 있습니까?

          견고성의 블록 하쉬 함수는 의사 랜덤 숫자를 생성하는 데 사용될 수 있습니다. 이 함수는 주어진 블록 번호의 해시 값을 반환하며, 이는 예측할 수 없으며 각 블록마다 다릅니다. 그러나이 방법에는 한계가 있습니다. 예를 들어, Blockhash 함수는 가장 최근의 256 블록에서만 작동하며, 채굴 전에 미래 블록의 블록 하쉬를 알 수 없습니다.

          임의의 숫자를 생성하기 위해 현재 블록 타임 스탬프를 사용하는 제한 사항은 무엇입니까?

          임의의 숫자를 생성하기 위해 현재 블록 타임 스탬프를 입력으로 사용하는 데 큰 제한이 있습니다. 광부는 광산 블록의 타임 스탬프에 약간의 영향을 미칩니다. 즉, 타임 스탬프를 조작하여 임의의 숫자로 생성 된 출력에 영향을 줄 수 있습니다.

          Randao Beacon을 사용하여 난수를 생성하는 방법은 무엇입니까?

          randao (랜덤 숫자 dao) 비콘은 분산되고 투명한 방법으로 랜덤 숫자를 생성하는 방법입니다. Randao Beacon Promise Secret Numbers의 참가자는 공개되고 결합되어 임의의 숫자를 생성합니다. 이 접근법은 단일 참가자가 임의의 숫자로 생성 된 출력에 영향을 줄 수 없도록 설계되었습니다.

          견고성에서 임의의 숫자를 생성하기위한 다가오는 개선 또는 제안이 있습니까?

          견고성 및 기타 블록 체인 플랫폼에서 임의의 수 생성 개선에 대한 연구 및 제안이 진행 중입니다. 예를 들어, 이더 리움 2.0 (다가오는 이더 리움 네트워크로의 업그레이드)에는 내장 임의의 숫자 생성기가 포함될 것으로 예상됩니다. 그러나 이러한 개선이 구현되기 전에 개발자는 기존 접근 방식과 고유 한 제한 및 잠재적 보안 위험을 계속 사용해야합니다.

위 내용은 견고성 함정 : 이더 리움의 무작위 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.