从 Solidity 中的另一个函数访问在一个函数中初始化的变量值
Accessing variable value initialized in one function from another function in Solidity
我正在创建一个智能合约,旨在提供一种在项目完成时获得报酬的可靠方式,但我遇到了一些问题。
到目前为止,主要有3个功能:
createProject()、joinProject() 和 submitProject()
我的项目结构如下:
//Project Model
struct project{
uint pid;
address clientAddr;
string name;
uint bidAmount;
string description;
uint deadline; //record unix timestamp
address freelancerAddr;
bool isOpen;
bool isSubmitted;
bool isAccepted;
}
现在我用客户端地址创建一个项目:
function createProject( uint _pid, string memory _name,
string memory _description,
uint _deadline) OnlyClient public payable{
require(msg.value >= 50,"insufficient funds");
project storage prj = projects[_pid];
prj.pid = _pid;
prj.clientAddr = msg.sender;
prj.name = _name;
prj.bidAmount = msg.value;
prj.description = _description;
prj.deadline = _deadline;
prj.isOpen = true;
prj.isSubmitted = false;
prj.isAccepted = false;
projectIDs.push(_pid) -1;
listProjects.push(_name) -1;
emit LogRegisterProject(_pid, prj.clientAddr, _name, prj.bidAmount, _description, _deadline, prj.isOpen);
}
但是 freelanceAddr 字段仍然是空的。它的值仅在自由职业者加入项目时由以下函数初始化:
function joinProject (uint _pid, address _freelancerAddr) OnlyFreelancer public {
require(projects[_pid].isOpen=true,"Project is not open yet");
projects[_pid].isOpen = false;
projects[_pid].freelancerAddr = _freelancerAddr;
emit LogJoinProject(msg.sender, _pid);
}
现在,我要提交项目。但在我这样做之前,我想检查调用 joinProject 的人和试图调用 submitProject 的人是同一个人。所以我尝试执行以下操作:
function submitProject(uint _pid, address _freelancerAddr) OnlyFreelancer public{
require(projects[_pid].freelancerAddr = msg.sender, "You haven't joined the project");
projects[_pid].isSubmitted = true;
}
但它给了我一个 TypeError: No matching declaration after argument-dependent lookup.
然而,当我在加入项目后 运行 getProjectDetails() 函数时,我可以看到更改已保存,并且所有状态也已保存。但是将该值传输到 submitProject() 中的关联调用时遇到问题。
我看到 Solidity 不允许 "null" 初始化,那么我能做些什么来解决这个错误,或者除了验证之外还有什么替代方法吗?
看起来这是一个小语法错误。
我一直在做:
require(projects[_pid].freelancerAddr = msg.sender, "You haven't joined the project");
但是,应该是“==”吧:
require(projects[_pid].freelancerAddr = msg.sender, "You haven't joined the project");
我是 Solidity 的新手,曾在其他类似比较中看到过使用单个“=”,所以也一直在做同样的事情。
我正在创建一个智能合约,旨在提供一种在项目完成时获得报酬的可靠方式,但我遇到了一些问题。
到目前为止,主要有3个功能: createProject()、joinProject() 和 submitProject()
我的项目结构如下:
//Project Model
struct project{
uint pid;
address clientAddr;
string name;
uint bidAmount;
string description;
uint deadline; //record unix timestamp
address freelancerAddr;
bool isOpen;
bool isSubmitted;
bool isAccepted;
}
现在我用客户端地址创建一个项目:
function createProject( uint _pid, string memory _name,
string memory _description,
uint _deadline) OnlyClient public payable{
require(msg.value >= 50,"insufficient funds");
project storage prj = projects[_pid];
prj.pid = _pid;
prj.clientAddr = msg.sender;
prj.name = _name;
prj.bidAmount = msg.value;
prj.description = _description;
prj.deadline = _deadline;
prj.isOpen = true;
prj.isSubmitted = false;
prj.isAccepted = false;
projectIDs.push(_pid) -1;
listProjects.push(_name) -1;
emit LogRegisterProject(_pid, prj.clientAddr, _name, prj.bidAmount, _description, _deadline, prj.isOpen);
}
但是 freelanceAddr 字段仍然是空的。它的值仅在自由职业者加入项目时由以下函数初始化:
function joinProject (uint _pid, address _freelancerAddr) OnlyFreelancer public {
require(projects[_pid].isOpen=true,"Project is not open yet");
projects[_pid].isOpen = false;
projects[_pid].freelancerAddr = _freelancerAddr;
emit LogJoinProject(msg.sender, _pid);
}
现在,我要提交项目。但在我这样做之前,我想检查调用 joinProject 的人和试图调用 submitProject 的人是同一个人。所以我尝试执行以下操作:
function submitProject(uint _pid, address _freelancerAddr) OnlyFreelancer public{
require(projects[_pid].freelancerAddr = msg.sender, "You haven't joined the project");
projects[_pid].isSubmitted = true;
}
但它给了我一个 TypeError: No matching declaration after argument-dependent lookup.
然而,当我在加入项目后 运行 getProjectDetails() 函数时,我可以看到更改已保存,并且所有状态也已保存。但是将该值传输到 submitProject() 中的关联调用时遇到问题。
我看到 Solidity 不允许 "null" 初始化,那么我能做些什么来解决这个错误,或者除了验证之外还有什么替代方法吗?
看起来这是一个小语法错误。
我一直在做:
require(projects[_pid].freelancerAddr = msg.sender, "You haven't joined the project");
但是,应该是“==”吧:
require(projects[_pid].freelancerAddr = msg.sender, "You haven't joined the project");
我是 Solidity 的新手,曾在其他类似比较中看到过使用单个“=”,所以也一直在做同样的事情。