我的问题是我无法通过transfer()
函数从买方地址向所有者地址付款。我尝试在completeOrder()
中执行此操作,但是我一次又一次遇到相同的错误。然后,我尝试通过Remix ide上买方地址上的sendtoOwner
函数进行调试。错误保持不变。
我收到的错误消息:
与UPChain.sendtoOwner的交易错误:VM错误:恢复。
恢复事务已恢复到初始状态。
注意:如果您发送值,则应向构造函数付款。
调试事务以获取更多信息。
我的代码:
pragma solidity ^0.5.0;
contract UPChain {
address payable public owner;
address payable public buyerAd;
uint private price;
Order private order;
mapping(uint => Product) offeredProducts;
uint private productseq;
uint private orderedProductseq;
struct Product{
string productName;
uint productPrice;
}
struct Order{
uint orderNo;
mapping(uint => Product) products;
}
modifier ownerMod {
require(owner == msg.sender);
_;
}
modifier buyerMod {
require(buyerAd == msg.sender);
_;
}
function () external payable {
buyerAd.transfer(msg.value);
}
constructor (address payable _buyerAd) public payable {
buyerAd = _buyerAd;
order = Order(1);
owner = msg.sender;
}
function addProduct(string memory _productName,uint _productPrice) public ownerMod{
offeredProducts[productseq] = Product(_productName,_productPrice);
productseq++;
}
function queryProduct(uint _productseq) public view returns(string memory, uint){
return (offeredProducts[_productseq].productName,offeredProducts[_productseq].productPrice);
}
// functions used by buyer
function addtoOrder(uint _productseq) public buyerMod{
order.products[orderedProductseq] = offeredProducts[_productseq];
orderedProductseq++;
}
function queryOrderedProduct(uint _orderedProductseq) public view buyerMod returns(string memory,uint){
return(order.products[_orderedProductseq].productName,order.products[_orderedProductseq].productPrice);
}
function completeOrder() public payable buyerMod returns(string memory,uint){
uint totalPrice=0;
for(uint i=0; i<orderedProductseq;i++){
totalPrice+= order.products[i].productPrice*1000000000000000000;
}
if(msg.value > totalPrice){
owner.transfer(msg.value);
return ("Order is completed", buyerAd.balance);
}
else{
revert();
return ("Order is not completed", buyerAd.balance);
}
}
//
function sendtoOwner(uint256 value) public payable buyerMod{
owner.transfer(value);
}
function setPrice(uint _price) public ownerMod {
price = _price;
}
function getPrice() public view returns(uint) {
return price;
}
function getContractValue() public payable returns(uint){
return owner.balance;
}
}
答案 0 :(得分:0)
我可以毫无问题地运行您的代码。调用以下函数时
function sendtoOwner(uint256 value) public payable buyerMod{
owner.transfer(value);
}
您使用所有者帐户或买方帐户打电话吗?执行此功能时,您需要以买方身份致电,因为您有一个修饰符,该修饰符会检查其买方还是所有者。如果它不是买家,那么它将恢复原状,这就是我所期望的情况。