StarkEx特定概念

Quantization and Resolution(量化和分解)

在以太坊区块链中,代币数量由256位数字表示。 但是,出于对效率的考量,StarkEx中的所有金额均由64位数字表示,用以表示-2 ^ 63到2 ^ 63之间的平衡。
由于所有链下交易的输入和某些链上请求均以StarkEx表示形式给出,因此,生成交易签名的代码使用正确的量化/分解至关重要。 因此,量化/分解反映在assetId(资产ID)即唯一的StarkEx资产表示形式中,如下所述。
在本节中,我们解释如何从一种表示形式转换到另一种表示形式。

Quantization量化

量化因子(有时称为量子)代表StarkEx代币数量的乘数,以获取区块链数量。如果资产的量子为q,则在StarkEx中有v个代币,以区块链表示形式则是
qvq*v
个代币。
例如,假设StarkEx中的ETH量化为10,000,000。 (注:在区块链中,ETH量用WEI表示,1 ETH =
101810^{-18}
WEI)。 这意味着我们系统中的“ 1”代表10,000,000 WEI或区块链上的
1011 10^{-11}
ETH
量化因子对于可以在链上表示的每项资产都是必需的。 当查看存款流量时,这一点很明显。 链上存款交易从用户那里获得了未量化的代币数量,但是链上调用的参数是量化数量

Resolution分解

分解因子表示量化的反方向。 也就是说,不是问“在系统中写1代表多少WEI”,而是问:“系统中代表1 ETH的数字是多少”。
例如,假设ETH的分解为10,000,000。 这也就是说我们系统中的10,000,000个代币代表1ETH,因此系统中的1是
10710^{-7}
ETH.
在永续交易中,我们对所有合成资产使用分解而不是量化。 注意,由于这些资产未在链上表示,因此不需要量化。 但是,分解具有以下优点:
● 由于已签名的外部Oracle(中介价格)是以整数单位给出的,例如BTC / ETH,而不是Satoshi / WEI,因此它可以合理地转换为系统中使用的价格。
● 由于用户通常指的是取整买卖,例如BTC,而不是satoshi(聪),这使系统更易于理解。

AssetInfo, AssetType and AssetId

在StarkEx内部并且独立于其标准(ETH / ERC20 / ERC721 / 合成资产),所有资产都具有相同的API。
在链下应用程序中,AssetId(资产ID)是所有链下流中资产的唯一标识(转款/有条件性转款/限价单/取款)
‌在永续交易中,合成资产不被显示在链上,因此链下的assetId(资产ID)对合成资产进行表示就足够了。 合成资产的assetId(资产ID)是一个120位数字,代表其身份和分解值。 例如,"ETH-8".encode('ascii')表示分解值为
10810^8
的以太币。
对于链上资产(非合成资产),链下资产ID加密绑定到链上显示的代币身份(用于存入/提取的外部ERC20 / 721,正确的量化值,等等),因此,assetId(资产ID)的计算如下:
    1.
    ‌ 我们所称的assetInfo(资产信息),即字符串连接的选择器(如下所述)和地址_(如果相关)。_它使StarkEx可以根据资产的初始标准来赎回资产。
    2.
    我们所称的assetType(资产类型),即assetInfo(资产信息) **和quantum(量子)的250位哈希。 它使StarkEx可以将链下__余额转换为链上余额
    3.
    我们所称的assetId(资产ID),这是一个250位的数字,其定义取决于资产标准。 assetId是唯一的链下资产标识符。
要计算assetInfoassetTypeassetId,我们需要:
    1.
    Selector选择器(4字节常数),用于指定资产标准。 是ETH,ERC20或是ERC721。
    2.
    Address地址**(如果相关),__资产合约地址
    3.
    Quantum(量子) **(如果相关),从链上256位整数余额到在StarkEx中63位整数余额的乘法因子。 只有被量子可整除的量才能被存入在系统中。
    4.
    TokenId (代币ID)**(如果相关),__ ERC721内容中的资产序列号

计算 assetInfo, assetTypeassetId

在下面,您可以找到计算的伪代码。此处可找到JS的完整实施。

ETH

1
def getEthAssetInfo():
2
ETH_SELECTOR = '0x8322fff2' # '0x8322fff2' = bytes4(keccak256(“ETH()”))
3
asset_info = ETH_SELECTOR
4
return asset_info
5
6
7
def getEthAssetType(quantum):
8
asset_info = getEthAssetInfo()
9
asset_type = keccak256(asset_info, quantum)
10
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
11
return asset_type
12
13
14
def getEthAssetId(quantum):
15
asset_id = getEthAssetType(quantum)
16
return asset_id
Copied!

ERC20

1
def getErc20AssetInfo(address):
2
ERC20_SELECTOR = '0xf47261b0'
3
# '0xf47261b0' = bytes4(keccak256('ERC20Token(address)'))
4
asset_info = ERC20_SELECTOR + bytes.fromhex(address[2:]).rjust(32, b'\0')
5
# For ERC20, asset_info is 36 bytes long
6
return asset_info
7
8
9
def getErc20AssetType(quantum, address):
10
asset_info = getErc20AssetInfo(address)
11
asset_type = keccak256(asset_info, quantum)
12
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
13
return asset_type
14
15
16
def getErc20AssetId(quantum, address):
17
asset_id = getErc20AssetType(quantum, address)
18
return asset_id
Copied!

ERC721

1
def getErc721AssetInfo(address):
2
ERC721_SELECTOR = '0x02571792'
3
# 0x02571792 = bytes4(keccak256('ERC721Token(address,uint256)'))
4
asset_info = ERC721_SELECTOR + bytes.fromhex(address[2:]).rjust(32, b'\0')
5
# For ERC721, asset_info is 36 bytes long.
6
return asset_info
7
8
9
def getErc721AssetType(address):
10
asset_info = getErc721AssetInfo(address)
11
asset_type = keccak256(asset_info, 1)
12
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
13
return asset_type
14
15
16
def getErc721AssetId(token_id, address):
17
asset_type = getErc721AssetType(address)
18
asset_id = keccak256('NFT:', asset_type, token_id)
19
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
20
return asset_id
Copied!

Mintable ERC721

1
def getErcMintable721AssetInfo(address):
2
MINTABLE_ERC721_SELECTOR = '0xb8b86672'
3
# 0xb8b86672 = bytes4(keccak256('MintableERC721Token(address,uint256)'))
4
asset_info = MINTABLE_ERC721_SELECTOR + bytes.fromhex(address[2:]).rjust(32, b'\0')
5
# For Mintable ERC721, asset_info is 36 bytes long.
6
return asset_info
7
8
9
def getMintableErc721AssetType(address):
10
asset_info = getErcMintable721AssetInfo(address)
11
asset_type = keccak256(asset_info, 1)
12
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
13
return asset_type
14
15
16
def getMintableErc721AssetId(minting_blob, address):
17
asset_type = getMintableErc721AssetType(address)
18
blob_hash = keccak256(minting_blob)
19
asset_id = keccak256('MINTABLE:', asset_type, blob_hash)
20
& 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
21
asset_id = asset_id
22
| 0x4000000000000000000000000000000000000000000000000000000000000000
23
return asset_id
Copied!

Mintable ERC20

1
def getErcMintable20AssetInfo(address):
2
MINTABLE_ERC20_SELECTOR = '0x68646e2d'
3
# 0xb8b86672 = bytes4(keccak256('MintableERC20Token(address)'))
4
asset_info = MINTABLE_ERC20_SELECTOR + bytes.fromhex(address[2:]).rjust(32, b'\0')
5
# For Mintable ERC20, asset_info is 36 bytes long.
6
return asset_info
7
8
9
def getMintableErc20AssetType(address, quantum):
10
asset_info = getErcMintable20AssetInfo(address)
11
asset_type = keccak256(asset_info, quantum)
12
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
13
return asset_type
14
15
16
def getMintableErc20AssetId(minting_blob, address, quantum):
17
asset_type = getMintableErc721AssetType(address, quantum)
18
blob_hash = keccak256(minting_blob)
19
asset_id = keccak256('MINTABLE:', asset_type, blob_hash)
20
& 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
21
asset_id = asset_id
22
| 0x4000000000000000000000000000000000000000000000000000000000000000
23
return asset_id
Copied!
Last modified 5mo ago