bestpractice 변수 시퀀스 조직. 견고성 스마트 계약에서 상태 변수를 정의하는 순서는 해당 변수를 사용하는 함수를 호출하는 동안뿐만 아니라 계약을 배포하는 동안 지출하는 가스 요금에 영향을 미칩니다. Solidity는 상태 변수를 256비트 슬롯에 저장하고 2개(또는 그 이상)의 연속 변수 크기를 더하면 256 이하가 되면 이러한 변수는 동일한 슬롯에 저장됩니다. (바이트와 같은 유형은 최대 2개의 슬롯을 획득할 수 있음) ... soliditygasoptimizationbestpractice 올바른 데이터 위치를 사용합니다. 계약을 생성하는 동안 올바른 데이터 위치를 사용하면 트랜잭션에서 가스를 절약할 수 있습니다. 견고한 데이터 위치: 저장소 - 변경을 도입하기 위해 상태 변수를 참조하는 동안 사용됨 메모리 - 변수가 메모리에 복사되고 이를 변경해도 블록체인의 상태가 변경되지 않습니다.(데이터를 얻기 위한 참조 상태 변수뿐만 아니라 함수 입력에도 사용할 수 있음) Calldata - 메모리와 동일하지만 함수 입... soliditygasoptimizationbestpractice 함수에서 스토리지 액세스 방지 - 1 많은 경우 메모리(로컬 변수)에서 데이터에 액세스하는 것이 스토리지(상태 변수)에서 데이터에 액세스하는 것보다 저렴합니다. 그러나 항상 그런 것은 아니며 메모리에 복사할 때 몇 가지 추가 단계가 필요한 상황이 있을 수 있습니다. 이 사례는 다른 게시물에서 실험해 보겠습니다. 이제 일반적인 경우에 초점을 맞추겠습니다. 다음 계약을 고려하십시오. varReferencing_1과 varRefere... soliditygasoptimizationbestpractice 함수에서 스토리지 액세스 방지 - 2 이 게시물은 메모리에서 데이터를 참조하여 가스를 절약하는 마지막 게시물에서 계속됩니다. 이제 우리는 이것이 모순될 수 있는 경우를 보게 될 것입니다. 다음 계약을 고려하십시오. 세 계약 모두 새 요소를 배열에 푸시하고 새 배열 길이로 모든 요소의 인덱스를 합산하고 배열에서 업데이트하는 기능이 완전히 동일합니다. (참고: 이 기능은 실제로 사용되지 않으며 단지 예일 뿐입니다.) 차이점과 각 계... soliditygasoptimizationbestpractice ReturnTypes | 코드리뷰 연대기 아니요, elseifs 도 아니고 모든 것이 a switch case 또는 a Dictionary/Map 일 수 있다는 것도 아닙니다. 그렇게 추론할 수 있습니까, 이 멍청한 컴파일러? 빠른 Google 검색을 통해 TypeScript 구성 파일에 사용할 수 있는 이 옵션을 찾았습니다. 또는 예일 수도 있지만, Linter 규칙(또는 Typescript 구성)처럼 독단적일 수 있으므로, 누군... beginnerstypescriptjavascriptbestpractice 모범 사례: 메이크파일 나는 직장과 사이드 프로젝트 모두에서 대부분의 내 프로젝트에 Makefile를 사용합니다.task group 명령을 통해 실행할 수 있는 Makefile에서 매우 쉽게 make를 생성할 수 있습니다. 내 모범 사례는 다음과 같습니다. Makefile에서 잡음을 일으킬 수 있는 모든 불필요한 정의를 제거합니다. 이제 내가 가장 좋아하는 템플릿Makefile을 구성하고 정의하는 데 6줄만 있습니... makefilephpbestpractice 변수 시퀀스 - 2 우리는 이전에 단일 슬롯에 여러 변수를 맞추면 실행 시 가스가 절약되는 것을 보았습니다. 그러나 이 경우에는 예외가 있습니다. 이전 관찰을 기억해 봅시다. 다음 계약을 고려하십시오. updateVar 함수 실행에 더 많은 가스 비용이 드는 계약은 무엇입니까? 추측했다면 varSequence2_1 맞습니다. 이것은 우리가 에서 본 것과 비슷합니다. 이제 다음 계약을 고려하십시오. 현재 어떤 계... gasoptimizationsoliditybestpractice 산술 오버플로우/언더플로우 Solidity 0.8.0부터 산술 오버플로우/언더플로우는 문제가 되지 않습니다. 그러나 이전 버전을 사용하는 경우 이 부분을 처리해야 합니다. 먼저 underflow/overflow가 무엇인지 이해합시다. 오버플로: 변수가 uint의 최대 제한(2**256-1)을 초과하면 0이 됩니다 예: uint var1 = 2**256 - 1 var1 + 1은 0이 됩니다. var1 + 2는 1이 됩니... soliditysecuritybestpractice ETH 강제 전송 - 1 이 취약점은 다음과 같은 유명한 견고성 기능으로 인해 발생합니다. selfdestruct(payable(addressThat)) , 이는 계약에 있는 모든 ETH를 addressThat의 다른 계약으로 보내는 데 사용됩니다. selfdestruct는 계약에서 모든 데이터를 지우고 블록체인의 공간을 확보하는 EVM 수준에서 작동합니다. 또한 모든 ETH를 다른 계약으로 보내는 것이 addres... soliditysecuritybestpractice ETH 강제 전송 - 2 지난 포스팅에서 selfdestruct에 대해 알아보았고, 어떤 컨트랙트에 강제로 ETH를 보내는 데 사용되는지 알아보았습니다. 이제 이 취약점이 무엇인지 이해하기 위해 예를 들어 보겠습니다. 다음 계약을 고려하십시오. 이제 다음 시나리오를 고려하십시오. 계약 잔액이 3ether에 도달했지만 일부 해커가 추가 ETH를 CrowdFund 계약 주소로 강제 전송합니다. 이제 계약 잔액 > fun... soliditysecuritybestpractice 재입국 스마트 계약의 외부 호출은 이더리움 블록체인에서 중요한 역할을 하며, 해커가 이를 사용하여 계약에서 추가 코드를 실행하도록 할 수 있습니다. 여러 사람으로부터 받은 eth를 저장하고 그들이 다시 인출할 수 있도록 하는 피해자 계약을 고려하십시오. 이제 이것이 피해자 계약에서 모든 자금을 훔치기 위해 공격을 받을 수 있는 방법을 이해합시다. 공격자 계약 체결 피해자 계약에 약간의 ETH 보내기... soliditysecuritybestpractice 서비스 거부 최대 ETH 기부자가 해당 계약의 소유자가 되도록 허용하는 계약이 있다고 가정해 보겠습니다. 이 블로그에서는 계약 취약성을 이용하여 그러한 계약을 탈취하는 것이 어떻게 가능한지 살펴보겠습니다. 다음 계약을 고려하십시오. 누구나 becomeOwner() 함수를 호출하고 balance보다 큰 금액을 전송하여 소유자가 될 수 있습니다. 호출 시 becomeOwner() 조건이 충족되면 balanc... soliditysecuritybestpractice 대리인 호출 - 컨텍스트가 보존됨 이것은 현실 세계에서는 결코 볼 수 없는 매우 간단하고 드문 취약점입니다. 그러나 어쨌든 슬쩍 피크를 찍자. 델리게이트 호출이 어떻게 작동하는지 이해합시다. contract_A에는 위임자가 contract_B를 호출하는 기능이 있습니다. 해당 함수가 호출되면 contract_B의 코드가 성공적으로 실행된 후 contract_A의 상태가 변경됩니다. 다음을 고려하세요: 델리게이트 호출에 대해 ... soliditysecuritybestpractice 델리게이트 콜 - 변수 순서 대리자 호출을 사용하는 동안 계약에서 변수의 순서가 얼마나 중요한지 염두에 두는 것이 중요합니다. 다음 예제를 통해 이를 이해해 봅시다. HackMe는 대리인이 무언가를 수행하기 위해 Lib 계약을 호출하는 계약입니다 가변 주문은 이 두 계약에서 동일하지 않습니다. HackMe 델리게이트의 doStuff() 함수는 Lib의 doStuff() 함수를 호출합니다. 그리고 Lib에서 이 함수는 첫... soliditysecuritybestpractice tx.origin 사용 시 주의 견고하게 우리는 호출자 또는 트랜잭션 제작자의 주소에 액세스하는 두 가지 방법, tx.origin 및 msg.sender 가 있습니다. 다음은 둘 사이의 차이점입니다. tx.origin - Alice -> 계약_A -> 계약_B; tx.origin = 앨리스 msg.sender - Alice -> 계약_A -> 계약_B;msg.sender = 계약_A 피싱 공격의 가능성이 있으므로 tx.or... soliditysecuritybestpractice 외부 계약 방지 견고성 스마트 계약에서 볼 수 있는 거의 모든 취약성은 일부 공격자 계약을 개발한 해커와 이 공격자 계약이 취약한 계약에 해를 끼치는 데 의해 발생합니다. 그건 그렇고, 흥미를 느끼신다면 스마트 컨트랙트 취약점에 대한 시리즈를 만들었습니다( ) 하지만 함수 호출자가 컨트랙트인지 일반 지갑 주소인지 알 수 있는 방법이 있다면 어떨까요? 그런 다음 외부 계약이 계약과 상호 작용하는 것을 중지하여... soliditysecuritybestpractice 코드 속의 마법은 무엇입니까? 왜 피해야 합니까? 이 코드에서, 나는 직접 함수 호출 persist() 을 작성했다.따라서 코드 세그먼트가 실행될 때 컴퓨터가 persist()에 대한 호출을 실행하기를 희망합니다.행위는 코드의 읽기 방식과 밀접하게 관련되어 있다.나는 큰소리로 낭독할 수 있다. 위의 대상 magician 은 모든 기존 대상을 찾아서 선택한 함수를 호출할 수 있다.따라서 함수persist()는 호출되지만 앞의 코드 세션과 같다... bestpracticemagicsoftware
변수 시퀀스 조직. 견고성 스마트 계약에서 상태 변수를 정의하는 순서는 해당 변수를 사용하는 함수를 호출하는 동안뿐만 아니라 계약을 배포하는 동안 지출하는 가스 요금에 영향을 미칩니다. Solidity는 상태 변수를 256비트 슬롯에 저장하고 2개(또는 그 이상)의 연속 변수 크기를 더하면 256 이하가 되면 이러한 변수는 동일한 슬롯에 저장됩니다. (바이트와 같은 유형은 최대 2개의 슬롯을 획득할 수 있음) ... soliditygasoptimizationbestpractice 올바른 데이터 위치를 사용합니다. 계약을 생성하는 동안 올바른 데이터 위치를 사용하면 트랜잭션에서 가스를 절약할 수 있습니다. 견고한 데이터 위치: 저장소 - 변경을 도입하기 위해 상태 변수를 참조하는 동안 사용됨 메모리 - 변수가 메모리에 복사되고 이를 변경해도 블록체인의 상태가 변경되지 않습니다.(데이터를 얻기 위한 참조 상태 변수뿐만 아니라 함수 입력에도 사용할 수 있음) Calldata - 메모리와 동일하지만 함수 입... soliditygasoptimizationbestpractice 함수에서 스토리지 액세스 방지 - 1 많은 경우 메모리(로컬 변수)에서 데이터에 액세스하는 것이 스토리지(상태 변수)에서 데이터에 액세스하는 것보다 저렴합니다. 그러나 항상 그런 것은 아니며 메모리에 복사할 때 몇 가지 추가 단계가 필요한 상황이 있을 수 있습니다. 이 사례는 다른 게시물에서 실험해 보겠습니다. 이제 일반적인 경우에 초점을 맞추겠습니다. 다음 계약을 고려하십시오. varReferencing_1과 varRefere... soliditygasoptimizationbestpractice 함수에서 스토리지 액세스 방지 - 2 이 게시물은 메모리에서 데이터를 참조하여 가스를 절약하는 마지막 게시물에서 계속됩니다. 이제 우리는 이것이 모순될 수 있는 경우를 보게 될 것입니다. 다음 계약을 고려하십시오. 세 계약 모두 새 요소를 배열에 푸시하고 새 배열 길이로 모든 요소의 인덱스를 합산하고 배열에서 업데이트하는 기능이 완전히 동일합니다. (참고: 이 기능은 실제로 사용되지 않으며 단지 예일 뿐입니다.) 차이점과 각 계... soliditygasoptimizationbestpractice ReturnTypes | 코드리뷰 연대기 아니요, elseifs 도 아니고 모든 것이 a switch case 또는 a Dictionary/Map 일 수 있다는 것도 아닙니다. 그렇게 추론할 수 있습니까, 이 멍청한 컴파일러? 빠른 Google 검색을 통해 TypeScript 구성 파일에 사용할 수 있는 이 옵션을 찾았습니다. 또는 예일 수도 있지만, Linter 규칙(또는 Typescript 구성)처럼 독단적일 수 있으므로, 누군... beginnerstypescriptjavascriptbestpractice 모범 사례: 메이크파일 나는 직장과 사이드 프로젝트 모두에서 대부분의 내 프로젝트에 Makefile를 사용합니다.task group 명령을 통해 실행할 수 있는 Makefile에서 매우 쉽게 make를 생성할 수 있습니다. 내 모범 사례는 다음과 같습니다. Makefile에서 잡음을 일으킬 수 있는 모든 불필요한 정의를 제거합니다. 이제 내가 가장 좋아하는 템플릿Makefile을 구성하고 정의하는 데 6줄만 있습니... makefilephpbestpractice 변수 시퀀스 - 2 우리는 이전에 단일 슬롯에 여러 변수를 맞추면 실행 시 가스가 절약되는 것을 보았습니다. 그러나 이 경우에는 예외가 있습니다. 이전 관찰을 기억해 봅시다. 다음 계약을 고려하십시오. updateVar 함수 실행에 더 많은 가스 비용이 드는 계약은 무엇입니까? 추측했다면 varSequence2_1 맞습니다. 이것은 우리가 에서 본 것과 비슷합니다. 이제 다음 계약을 고려하십시오. 현재 어떤 계... gasoptimizationsoliditybestpractice 산술 오버플로우/언더플로우 Solidity 0.8.0부터 산술 오버플로우/언더플로우는 문제가 되지 않습니다. 그러나 이전 버전을 사용하는 경우 이 부분을 처리해야 합니다. 먼저 underflow/overflow가 무엇인지 이해합시다. 오버플로: 변수가 uint의 최대 제한(2**256-1)을 초과하면 0이 됩니다 예: uint var1 = 2**256 - 1 var1 + 1은 0이 됩니다. var1 + 2는 1이 됩니... soliditysecuritybestpractice ETH 강제 전송 - 1 이 취약점은 다음과 같은 유명한 견고성 기능으로 인해 발생합니다. selfdestruct(payable(addressThat)) , 이는 계약에 있는 모든 ETH를 addressThat의 다른 계약으로 보내는 데 사용됩니다. selfdestruct는 계약에서 모든 데이터를 지우고 블록체인의 공간을 확보하는 EVM 수준에서 작동합니다. 또한 모든 ETH를 다른 계약으로 보내는 것이 addres... soliditysecuritybestpractice ETH 강제 전송 - 2 지난 포스팅에서 selfdestruct에 대해 알아보았고, 어떤 컨트랙트에 강제로 ETH를 보내는 데 사용되는지 알아보았습니다. 이제 이 취약점이 무엇인지 이해하기 위해 예를 들어 보겠습니다. 다음 계약을 고려하십시오. 이제 다음 시나리오를 고려하십시오. 계약 잔액이 3ether에 도달했지만 일부 해커가 추가 ETH를 CrowdFund 계약 주소로 강제 전송합니다. 이제 계약 잔액 > fun... soliditysecuritybestpractice 재입국 스마트 계약의 외부 호출은 이더리움 블록체인에서 중요한 역할을 하며, 해커가 이를 사용하여 계약에서 추가 코드를 실행하도록 할 수 있습니다. 여러 사람으로부터 받은 eth를 저장하고 그들이 다시 인출할 수 있도록 하는 피해자 계약을 고려하십시오. 이제 이것이 피해자 계약에서 모든 자금을 훔치기 위해 공격을 받을 수 있는 방법을 이해합시다. 공격자 계약 체결 피해자 계약에 약간의 ETH 보내기... soliditysecuritybestpractice 서비스 거부 최대 ETH 기부자가 해당 계약의 소유자가 되도록 허용하는 계약이 있다고 가정해 보겠습니다. 이 블로그에서는 계약 취약성을 이용하여 그러한 계약을 탈취하는 것이 어떻게 가능한지 살펴보겠습니다. 다음 계약을 고려하십시오. 누구나 becomeOwner() 함수를 호출하고 balance보다 큰 금액을 전송하여 소유자가 될 수 있습니다. 호출 시 becomeOwner() 조건이 충족되면 balanc... soliditysecuritybestpractice 대리인 호출 - 컨텍스트가 보존됨 이것은 현실 세계에서는 결코 볼 수 없는 매우 간단하고 드문 취약점입니다. 그러나 어쨌든 슬쩍 피크를 찍자. 델리게이트 호출이 어떻게 작동하는지 이해합시다. contract_A에는 위임자가 contract_B를 호출하는 기능이 있습니다. 해당 함수가 호출되면 contract_B의 코드가 성공적으로 실행된 후 contract_A의 상태가 변경됩니다. 다음을 고려하세요: 델리게이트 호출에 대해 ... soliditysecuritybestpractice 델리게이트 콜 - 변수 순서 대리자 호출을 사용하는 동안 계약에서 변수의 순서가 얼마나 중요한지 염두에 두는 것이 중요합니다. 다음 예제를 통해 이를 이해해 봅시다. HackMe는 대리인이 무언가를 수행하기 위해 Lib 계약을 호출하는 계약입니다 가변 주문은 이 두 계약에서 동일하지 않습니다. HackMe 델리게이트의 doStuff() 함수는 Lib의 doStuff() 함수를 호출합니다. 그리고 Lib에서 이 함수는 첫... soliditysecuritybestpractice tx.origin 사용 시 주의 견고하게 우리는 호출자 또는 트랜잭션 제작자의 주소에 액세스하는 두 가지 방법, tx.origin 및 msg.sender 가 있습니다. 다음은 둘 사이의 차이점입니다. tx.origin - Alice -> 계약_A -> 계약_B; tx.origin = 앨리스 msg.sender - Alice -> 계약_A -> 계약_B;msg.sender = 계약_A 피싱 공격의 가능성이 있으므로 tx.or... soliditysecuritybestpractice 외부 계약 방지 견고성 스마트 계약에서 볼 수 있는 거의 모든 취약성은 일부 공격자 계약을 개발한 해커와 이 공격자 계약이 취약한 계약에 해를 끼치는 데 의해 발생합니다. 그건 그렇고, 흥미를 느끼신다면 스마트 컨트랙트 취약점에 대한 시리즈를 만들었습니다( ) 하지만 함수 호출자가 컨트랙트인지 일반 지갑 주소인지 알 수 있는 방법이 있다면 어떨까요? 그런 다음 외부 계약이 계약과 상호 작용하는 것을 중지하여... soliditysecuritybestpractice 코드 속의 마법은 무엇입니까? 왜 피해야 합니까? 이 코드에서, 나는 직접 함수 호출 persist() 을 작성했다.따라서 코드 세그먼트가 실행될 때 컴퓨터가 persist()에 대한 호출을 실행하기를 희망합니다.행위는 코드의 읽기 방식과 밀접하게 관련되어 있다.나는 큰소리로 낭독할 수 있다. 위의 대상 magician 은 모든 기존 대상을 찾아서 선택한 함수를 호출할 수 있다.따라서 함수persist()는 호출되지만 앞의 코드 세션과 같다... bestpracticemagicsoftware