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 의 개념이 나온다. 이게 뭔지 알아보면 다음과 같다.
- Bouncable
- 발송 가능한 주소의 경우: "EQCD”
- 이 주소는 메시지를 수신할 수 있다. tact에서의 메시지는 함수 호출로 이해하는 게 쉽니다. 일반적으로 이러한 유형의 주소는 스마트 컨트랙트를 나타내는 데 사요되기 때문에, 스마트 컨트랙트에 정의되어 있는 함수를 호출할 수 있다.
- 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를 호출해보면 아래와 같은 결과를 확인할 수 있다.
- a = a1
- 딱 봐도 같음
- a = a2
- a2 는 non-bounceable 한 주소라서 주소로 같다.
- a = a3,
- newAddress(0, 0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8);
- 위 주소는 워크체인 ID가 0, 그리고 private key가 0x83dfd552e63729b472fcbcc8c45ebcc6691702558b68ec7527e1ba403a0f31a8 인 주소로 예정된다.
- a ≠ a4
- myAddress() 는 컨트랙트 주소이기에 a 와 다르다.
- a = a5
- 해당 컨트랙트를 배포한 계정과 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 |
댓글