如何在 Solidity 中部署后持久化数据
How to persist data after deployment in Solidity
我对 Solidity 和 Ethereum 总体来说还很陌生。
在我正在开发的 (d)app 中,我需要能够将数据保存到账本上,但我不确定我是否理解它是如何工作的。
假设我有以下合同(为实用而简化):
contract UserContract {
struct User {
address walletAddress;
string organisation;
string fName;
string lName;
string email;
uint index;
}
mapping(address => User) private users;
address[] private userIndex;
function insertUser(
address walletAddress,
string organisation,
string fName,
string lName,
string email )
public
returns(uint index) {
User memory newUser = User({
walletAddress: walletAddress,
organisation: organisation,
fName: fName,
lName: lName,
email: email,
index: users.length
});
users.push(newUser);
userIndex[walletAddress] = newUser.index;
return newUser.index;
}
}
使用 insertUser()
方法,我可以插入一个新用户,使用 getter 方法,我可以检索用户的信息。
现在,如果我更新合约(因此部署一个新合约),users
映射再次为空,不足为奇。
我的问题:如何以一种可供未来版本的合约访问的方式存储数据?任何设计模式都伴随着这个过程吗?
谢谢!
因为,如您所知,存储的数据不会随新合约一起传输,并且在使用几次后将数据复制到新合约将是一项昂贵的任务……最好的办法是将功能与数据存储分开。
使用一些只处理数据存储的基本 setter 和 getter 创建合约(如有必要,来自特定合约地址)...然后创建连接到数据合约的主要功能合约。
我对 Solidity 和 Ethereum 总体来说还很陌生。 在我正在开发的 (d)app 中,我需要能够将数据保存到账本上,但我不确定我是否理解它是如何工作的。
假设我有以下合同(为实用而简化):
contract UserContract {
struct User {
address walletAddress;
string organisation;
string fName;
string lName;
string email;
uint index;
}
mapping(address => User) private users;
address[] private userIndex;
function insertUser(
address walletAddress,
string organisation,
string fName,
string lName,
string email )
public
returns(uint index) {
User memory newUser = User({
walletAddress: walletAddress,
organisation: organisation,
fName: fName,
lName: lName,
email: email,
index: users.length
});
users.push(newUser);
userIndex[walletAddress] = newUser.index;
return newUser.index;
}
}
使用 insertUser()
方法,我可以插入一个新用户,使用 getter 方法,我可以检索用户的信息。
现在,如果我更新合约(因此部署一个新合约),users
映射再次为空,不足为奇。
我的问题:如何以一种可供未来版本的合约访问的方式存储数据?任何设计模式都伴随着这个过程吗?
谢谢!
因为,如您所知,存储的数据不会随新合约一起传输,并且在使用几次后将数据复制到新合约将是一项昂贵的任务……最好的办法是将功能与数据存储分开。
使用一些只处理数据存储的基本 setter 和 getter 创建合约(如有必要,来自特定合约地址)...然后创建连接到数据合约的主要功能合约。