Truffle

創建兩個契約,每個契約都有不同的帳戶。

  • December 27, 2018

我是區塊鏈的新手。我試圖使用兩個不同的合約重複 DAO 攻擊,在我的例子中是 DAO 和 Hacker。我希望 2 個合約屬於 2 個單獨的賬戶,所以我可以看到乙太坊從 DAO 合約持有人到 Genache 的 Hacker 合約持有人。但是,我被卡住了,因為我只能使用基於命令的同一帳戶遷移我的契約truffle --migrate -reset

以下是 DAO 和 Hacker 的合約:

pragma solidity ^0.4.24;

contract Dao {
   struct User {
       address addr;
       string name;
       uint balence;
       uint8 flag;
   }

   //Fetch User
   mapping(address=>User) users; // create HashArray<address,User>, which can be random access

   uint public userCount;

   constructor() public {
       //user = "hello"; just for testing
       //addUser("wei");
       //addUser("alex");
   }

   function addUser (address _addr, string _name, uint _balence, uint _flag) private {
       users[_addr] = User(_addr,_name,0,1);
       userCount++;
   }

   function addToBalence(string name) public payable{
       if(users[msg.sender].flag != 1) addUser(msg.sender,name,0,1);
       users[msg.sender].balence = users[msg.sender].balence + msg.value;
   }

   function showBalence(address) public returns (uint) {
       return users[msg.sender].balence;
   }

   function withdraw(uint amount) public payable{

       if(users[msg.sender].flag != 1) revert("user does not exist");
       else if (users[msg.sender].balence >= amount){
           msg.sender.call.value(amount)();
           users[msg.sender].balence -= amount;
       }
       else return false;
   }
   }
}

contract Hacker {
   // the address of the user, so the money can be transfered
   Dao dao;
   address userAddress;
   string userName;

   constructor(string name, address daoAddr) public {
       dao = Dao(daoAddr);
       userAddress = msg.sender;
       userName = name;
   }

   function payout(uint amount) public payable{
       dao.withdraw(amount);
   }
}

在您的 Truffle 遷移文件中,您可以指定from實際部署合約的帳戶。詳細資訊在他們的文件中。

假設您在本地區塊鏈模擬器中使用 Ganache 之類的工具,應該為您提供 10 個可以訪問的帳戶,如下所示:

var MyContract1 = artifacts.require("MyContract1");
var MyContract2 = artifacts.require("MyContract2");

module.exports = function(deployer) {
 deployer.deploy(MyContract1, {from: web3.eth.accounts[0]});
 deployer.deploy(MyContract2, {from: web3.eth.accounts[1]});
};

讓我知道這是否有幫助。

引用自:https://ethereum.stackexchange.com/questions/64633