본문 바로가기
블록체인/TACT

[Tact] Addresses

by 제이제이_은재 2024. 5. 17.
반응형

Addresses

https://tact-by-example.org/02-addresses

 

이더리움과 마찬가지로 주소는 기본 데이터 유형 중 하나이다. 주소는 스마트 컨트랙트와 사용자 주소를 식별하는 데 사용된다. 각 스마트 컨트랙트, 사용자 주소는 고유한 값이며, 이를 통해 TON 네트워크 상에서 서로 상호작용하게 된다.

 

톤은 부하를 분산시키기 위해 워크체인라고 불리는 여러 체인으로 분할되어 있다. 표준 워크체인은 워크체인 ID 가 0인데 이는 일반 사용자의 스마트 컨트랙트와 사용자 계정을 위한 것이며, 워크체인 ID 가 1인 마스터체인은 검증자를 위한 것이다. 마스터체인은 가스비용이 훨씬 더 비싸지만, 보안적으로 훨씬 더 안정적이라는 특징이 있다.

 

주소는 일반적으로 워크체인 ID 와 계정 ID 로 구성되어 있다. 워크체인 ID 는 특정 주소가 속한 워크체인을 식별하고, 계정 ID 는 워크체인 내에서 특정 계약 또는 계정을 식별한다. 이 두가지 요소가 결합되어 고유한 주소가 형성된다.

 

마지막으로, 주소를 저장하는 데 필요한 비용도 중요하다. 대부분의 주소는 저장에 264 비트가 소요된다. (워크체인 ID (8 bit) + 계정 ID (256 bit)). 계산해보면, 1000개의 주소를 저장하는 데 드는 비용은 1년에 대략 0.189 TON 이다.

위 내용을 기반으로 아래 코드를 한 번 살펴보자.

 

import "@stdlib/deploy";

contract Addresses with Deployable {

    // contract persistent state variables
    // we have three representations of the same address
    a1: Address = address("EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N"); // bouncable (same foundation wallet)
    a2: Address = address("UQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqEBI"); // non-bounceable (same foundation wallet)
    a3: Address;

    a4: Address;
    a5: Address;
    a6: Address;

    init() {
        // this is the third representation of the same address
        self.a3 = newAddress(0, 0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8); // raw (same foundation wallet)
        
        // here are a few other important addresses
        self.a4 = newAddress(0, 0); // the zero address (nobody)
        self.a5 = myAddress();      // address of this contract
        self.a6 = sender();         // address of the deployer (the sender during init())
    }

    receive("show all") {
        /// addresses cannot currently be dumped
        /// TODO: https://github.com/tact-lang/tact/issues/16
        /// dump(self.a1);
    }

    receive("show ops") {
        // temporary variable
        let a: Address = address("EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N"); // bouncable (same foundation wallet)

        dump(a == self.a1);
        dump(a == self.a2);
        dump(a == self.a3);
        
        dump(a == self.a4);
        dump(a != self.a5);
    }

    get fun result(): Address {
        return self.a1;
    }
}

 

일단 여기서 bouncable 과 non-bounceable 의 개념이 나온다. 이게 뭔지 알아보면 다음과 같다.

  1. Bouncable
    • 발송 가능한 주소의 경우: "EQCD”
    • 이 주소는 메시지를 수신할 수 있다. tact에서의 메시지는 함수 호출로 이해하는 게 쉽니다. 일반적으로 이러한 유형의 주소는 스마트 컨트랙트를 나타내는 데 사요되기 때문에, 스마트 컨트랙트에 정의되어 있는 함수를 호출할 수 있다.
  2. Non-bounceable
    • 발송 불가능한 주소의 경우: "UQCD”
    • 이 주소는 메시지를 수신할 수 없다. 즉, 해당 주소에 메시지를 보낼 수 없으며 주소를 나타내는 데 사용한다. 이러한 주소는 개인 계정을 나타내는데 사용되기 때문에 잔고를 추적하거나 특정 계정에 대한 정보를 저장하는 데 사용될 수 있다.

 

그렇기 때문에, 아래 두 주소가 같다고 한다. 아직 왜 이렇게 만들어졌는지 이해가 안 된다.

a1: Address = address("EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N"); // bouncable (same foundation wallet)
a2: Address = address("UQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqEBI"); // non-bounceable (same foundation wallet)

result 함수를 호출해보면, a1의 값을 아래와 같이 확인할 수 있다.

get fun result(): Address {
    return self.a1;
}

> 🔍 Calling getter result:
Return value: EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N

이제 show ops를 호출해보면 아래와 같은 결과를 확인할 수 있다.

 

  1. a = a1
    1. 딱 봐도 같음
  2. a = a2
    1. a2 는 non-bounceable 한 주소라서 주소로 같다.
  3. a = a3,
    1. newAddress(0, 0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8);
    2. 위 주소는 워크체인 ID가 0, 그리고 private key가 0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8 인 주소로 예정된다.
  4. a ≠ a4
    1. myAddress() 는 컨트랙트 주소이기에 a 와 다르다.
  5. a = a5
    1. 해당 컨트랙트를 배포한 계정과 a는 동일하다.
> 📤 Sending message show ops:
Message sent: "show ops", from deployer, to contract, value 1, not bounced
#DEBUG#: true
#DEBUG#: true
#DEBUG#: true
#DEBUG#: false
#DEBUG#: true
Transaction Executed: success, Exit Code: 0, Gas: 0.01163

여전히 bouncable, non-bounceable 의 개념이 완전히 이해되지는 않지만.. 계속 보다보면 더 알겠지?

반응형

'블록체인 > TACT' 카테고리의 다른 글

TON 블록체인 네트워크 테스트넷 faucet 받기  (0) 2024.05.21
[Tact] Strings  (0) 2024.05.17
[Tact] Bools  (0) 2024.05.15
[Tact] Integer Opertaions  (0) 2024.05.15
[Tact] Integers  (0) 2024.05.15

댓글