Caractéristiques importantes des contrats intelligents Solidity

Certaines caractéristiques importantes des contrats intelligents de solidité, telles que les variables de stockage et de mémoire dans les baies de longueur variable, les emplacements de stockage de stockage et de mémoire, et l'utilisation de string array string [].

Plus de technologie blockchain et de classification des applications:

Blockchain applicationBlockchain     développement

Ethernet Square | Fabric | BCOS | cryptographie | algorithme de consensus | bitcoinAutre chaîne

Économie des jetonsScénarios financiers traditionnels | Finance décentralisée | Traçabilité anti-contrefaçon | Partage de données | Dépôt de confiance

1. Concernant les tableaux de longueur variable.

chaîne [] , octets []

Pour les tableaux de longueur variable, ils ne peuvent pas être utilisés avant l'initialisation de l'espace alloué. Vous pouvez initialiser un tableau avec le mot-clé new. Ils ne sont pas accessibles à l'aide d'indices avant l'initialisation avec le nouveau mot-clé.

espace de rangement

Le tableau dynamique de type de stockage a un attribut de longueur, qui représente la longueur actuelle du tableau. Pour les tableaux de stockage de longueur variable, vous pouvez ajuster la longueur du tableau en attribuant une valeur à length. Vous pouvez modifier la longueur du tableau de deux manières, index ++ et méthode push.

contract test{
    
    string[] strs = new string[](0);
    
    function test1() public returns(uint, string[]){
        strs[strs.length++] = "a1";
        return (strs.length, strs);
    }
    
    function test2() public returns(uint, string[]){
        strs.push("b1");
        return (strs.length, strs);
    }
}

Mémoire

Le tableau dynamique de type mémoire ne prend pas en charge la modification de la propriété length pour ajuster la taille du tableau. Une fois le nouveau terminé, la taille ne peut pas être modifiée.

2. Stockage et mémoire de l'emplacement de stockage

Attribuer de la mémoire au stockage

contract test1{
    int i;
    struct S{string a;uint b;}
 
    function assign(S s) internal{
        S tmp = s;  // 报错,tmp是局部变量(storage类型),s是函数参数(memory类型)
    }
    function change(int changei) public returns(int){
        i = changei;
        return i; // 返回等于changei的值
    }
}

Convertir le stockage en stockage

contract test2{
    
    struct S{string a;uint b;}
    
    //状态变量,合约内声明的公有变量,默认是storage的
    S s;
    
    function convertStorage(S storage s) internal{
        S tmp = s;  // tmp也是storage类型的
        tmp.a = "Test";
    }
    
    function call() returns (string){
        convertStorage(s);
        return s.a;//Test
    }
}

Attribuer de la mémoire au stockage

contract test3{
  struct S{string a;uint b;}
 
  //默认是storage的
  S s;
 
  function memoryToState(S memory tmp) internal{
    s = tmp; //tmp是memory的,从内存中复制到状态变量中。
 
    //修改旧memory中的值,并不会影响状态变量
    tmp.a = "Test";
  }
 
  function call() returns(string){
    S memory tmp = S("memory", 0);
    memoryToState(tmp);
 
    return s.a;
  }
}

Attribuer de la mémoire aux variables locales (stockage)

contract test4{
  struct S{string a;uint b;}
 
  function memoryToLocal(S s) internal{
    S tmp = s;  // 报错,tmp是局部变量(storage类型),s是函数参数(memory类型)
    
    //修改变量为memory类型, 不会报错
    S memory tmp = s;
  }
}

mémoire d'affectation de stockage

contract test5{
    struct S{string a;uint b;}
    
    S s = S("storage", 1);
    
    function storageToMemory(S storage x) internal{
        S memory tmp = x;//由Storage拷贝到memory中
        
        //memory的修改不影响storage
        tmp.a = "Test";
    }
    
    function call() returns (string){
        storageToMemory(s);
        return s.a; //storage
    }
}

mémoire d'affectation de mémoire

La mémoire est transmise par référence et les données ne sont pas copiées. L'affectation d'un type de référence d'une mémoire à une référence d'une autre mémoire ne créera pas une nouvelle copie.

contract test6{
  struct S{string a;uint b;}
 
  //默认参数是memory
  function memoryToMemory(S s) internal{
    S memory tmp = s; // tmp是memory,s是memory
 
    //引用传递
    tmp.a = "other memory";
  }
 
  function call() returns (string){
    S memory mem = S("memory", 1);
    memoryToMemory(mem);
    return mem.a;//other memory
  }
}

3. Chaîne de tableau de chaînes []

    function getEntry(string[] fields, Entry entry) internal view returns (string[]) {
        //string[] values = new string[](fields.length); 报错,values是storage类型的,后面是memory
        for (uint i = 0; i < fields.length; i++) {
            values[i] = entry.getString(fields[i]);
        }
        return values;
    }
    function getEntry(string[] fields, Entry entry) internal view returns (string[]) {
        string[] memory values = new string[](fields.length); // 正确
        for (uint i = 0; i < fields.length; i++) {
            values[i] = entry.getString(fields[i]);
        }
        return values;
    }


Lien d'origine: Caractéristiques importantes des contrats intelligents Solidity 

Je suppose que tu aimes

Origine blog.csdn.net/JonasErosonAtsea/article/details/109236301
conseillé
Classement