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

def getEthAssetInfo():
ETH_SELECTOR = '0x8322fff2' # '0x8322fff2' = bytes4(keccak256(“ETH()”))
asset_info = ETH_SELECTOR
return asset_info
def getEthAssetType(quantum):
asset_info = getEthAssetInfo()
asset_type = keccak256(asset_info, quantum)
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
return asset_type
def getEthAssetId(quantum):
asset_id = getEthAssetType(quantum)
return asset_id

ERC20

def getErc20AssetInfo(address):
ERC20_SELECTOR = '0xf47261b0'
# '0xf47261b0' = bytes4(keccak256('ERC20Token(address)'))
asset_info = ERC20_SELECTOR + bytes.fromhex(address[2:]).rjust(32, b'\0')
# For ERC20, asset_info is 36 bytes long
return asset_info
def getErc20AssetType(quantum, address):
asset_info = getErc20AssetInfo(address)
asset_type = keccak256(asset_info, quantum)
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
return asset_type
def getErc20AssetId(quantum, address):
asset_id = getErc20AssetType(quantum, address)
return asset_id

ERC721

def getErc721AssetInfo(address):
ERC721_SELECTOR = '0x02571792'
# 0x02571792 = bytes4(keccak256('ERC721Token(address,uint256)'))
asset_info = ERC721_SELECTOR + bytes.fromhex(address[2:]).rjust(32, b'\0')
# For ERC721, asset_info is 36 bytes long.
return asset_info
def getErc721AssetType(address):
asset_info = getErc721AssetInfo(address)
asset_type = keccak256(asset_info, 1)
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
return asset_type
def getErc721AssetId(token_id, address):
asset_type = getErc721AssetType(address)
asset_id = keccak256('NFT:', asset_type, token_id)
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
return asset_id

Mintable ERC721

def getErcMintable721AssetInfo(address):
MINTABLE_ERC721_SELECTOR = '0xb8b86672'
# 0xb8b86672 = bytes4(keccak256('MintableERC721Token(address,uint256)'))
asset_info = MINTABLE_ERC721_SELECTOR + bytes.fromhex(address[2:]).rjust(32, b'\0')
# For Mintable ERC721, asset_info is 36 bytes long.
return asset_info
def getMintableErc721AssetType(address):
asset_info = getErcMintable721AssetInfo(address)
asset_type = keccak256(asset_info, 1)
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
return asset_type
def getMintableErc721AssetId(minting_blob, address):
asset_type = getMintableErc721AssetType(address)
blob_hash = keccak256(minting_blob)
asset_id = keccak256('MINTABLE:', asset_type, blob_hash)
& 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
asset_id = asset_id
| 0x4000000000000000000000000000000000000000000000000000000000000000
return asset_id

Mintable ERC20

def getErcMintable20AssetInfo(address):
MINTABLE_ERC20_SELECTOR = '0x68646e2d'
# 0xb8b86672 = bytes4(keccak256('MintableERC20Token(address)'))
asset_info = MINTABLE_ERC20_SELECTOR + bytes.fromhex(address[2:]).rjust(32, b'\0')
# For Mintable ERC20, asset_info is 36 bytes long.
return asset_info
def getMintableErc20AssetType(address, quantum):
asset_info = getErcMintable20AssetInfo(address)
asset_type = keccak256(asset_info, quantum)
& 0x03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
return asset_type
def getMintableErc20AssetId(minting_blob, address, quantum):
asset_type = getMintableErc721AssetType(address, quantum)
blob_hash = keccak256(minting_blob)
asset_id = keccak256('MINTABLE:', asset_type, blob_hash)
& 0x0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
asset_id = asset_id
| 0x4000000000000000000000000000000000000000000000000000000000000000
return asset_id