Blockchain (Hyperledger Fabric)/작업 중인 Solution

Hyperledger Composer Logic(Transaction 수행) Ver. 0.0.3

김야키 2019. 3. 30. 01:50

 

Logic(Transaction 수행 작업) 설정

 

작성일자 2019.03.30

Ver 0.0.3

 

/**
 * @param {org.example.mynetwork.SendMoney} sendMoney
 * @transaction
 */
async function sendMoney(tx) {
	// 일반 사용자 정보 선언
    const normal = tx.normal;
    // 회계 사용자 정보 선언
    const accoutant = tx.accoutant;
    // 회비 납부 그룹 정보 선언
    const groupPay = tx.groupPay;

	// 일반 사용자 그룹 이름
    const norGroup = normal.groupName.toString();
    // 회계 사용자 그룹 이름
    const accGroup = accoutant.groupName.toString();
    // 회비를 납부할 그룹의 이름
    const allGroupName = groupPay.groupName.toString();

	// 회계로 입력된 사용자 유형 (회계 여부 판단)
    const Accoutant = accoutant.account.toString();

	// 납부자, 회계, 그룹 이름 일치 확인
    if( norGroup == accGroup &&
        accGroup == allGroupName &&
        allGroupName == norGroup )
    {
    	// 납부자가 현제 회비 납부 여부 확인
        if(normal.state){
        	// 회계로 입력된 사용자의 유형이 회계인지 확인
            if(Accoutant == "accoutant"){
            	// 2중 납부 방지를 위해 납부자의 state를 false로 변경
                normal.state = false;
                // 그룹 정보에 납부자 수를 1증가
                groupPay.participantNum += 1;
                // 그룹 정보에 현제 납부 된 회비 금액을 증가
                groupPay.nowPay += groupPay.pay;

				// registroy에 저장된 Participant 정보를 선언
                const participantRegistry = await getParticipantRegistry('org.example.mynetwork.Group');
                // Participant정보 업데이트
                await participantRegistry.update(tx.normal);
				
                // registroy에 저장된 Asset정보 선언
                const assetRegistry = await getAssetRegistry('org.example.mynetwork.GroupPay');
                // Asset정보 업데이트
                await assetRegistry.update(tx.groupPay);
                
                // 납부가 완료되면 "Success"를 반환
                return "Success"
            }
            // 입력된 회계의 유형이 회계가 아닌 경우 반환
            return "Please confirm your accoutant"
        }
        // 납부자가 이미 회비를 납부 한 경우
        return "I already paid my dues."
    }
    // 그룹의 이름이 일치하지 않는 경우
    return "Group is not matching";
}

// 사용자 유형 변경 JS
/**
 * @param {org.example.mynetwork.ChangeAccount} changeAccount
 * @transaction
 */
async function changeAccount(tx){
	// 관리자 정보 선언
    const Master = tx.Master;
    // 회계 사용자 정보 선언
    const Accoutant = tx.Accoutant;
    // 일반 사용자 정보 선언
    const Normal = tx.Normal;

	// 관리자의 그룹 정보
    const MaterGroup = Master.groupName.toString();
    // 회계 사용자의 그룹 정보
    const AccoutantGroup = Accoutant.groupName.toString();
    // 일반 사용자의 그룹 정보
    const NormalGroup = Normal.groupName.toString();

	// 관리자로 선언 된 인원의 그룹이 "admin"인지 판단
    if(MaterGroup == "admin"){
    	// 관리자의 권한이 "master"인지 확인
        if(Master.account == "master"){
        	// 회계 및 일반 사용자의 그룹이 동일한 그룹인지 확인
            if(NormalGroup == AccoutantGroup){
            	// 회계로 선언된 사용자의 유형이 "accoutant"인지 확인
                if(Accoutant.account == "accoutant"){
                	// 일반 사용자 유형을 "accoutant"인 회계로 변경
                    Normal.account = "accoutant";
                    // 회계 사용자의 유형을 "normal"로 변경
                    Accoutant.account = "normal";

					// registroy에 저장된 Participant 선언
                    const participantRegistry = await getParticipantRegistry('org.example.mynetwork.Group');
                    // Normal로 선언된 Participant정보 업데이트
                    await participantRegistry.update(tx.Normal);
                    // Accoutant로 선언된 Participant정보 업데이트
                    await participantRegistry.update(tx.Accoutant);
					
                    // 권한 수정이 완료된 경우 완료 메시지 반환
                    return "Permission modification successed"
                }
                // 회계로 선언된 사용자의 권한이 회계가 아닌 경우
                return "Please confirm Accoutant";
            }
            // 각각 선언된 사용자의 그룹이 일치하지 않은 경우
            return "Group is not matching";
        }
        // 관리자로 선언된 정보의 권한이 "master"이 아닌경우
        return "Your not have authority";
    }
    // 관리자로 선언된 정보의 그룹이 "admin"이 아닌 경우
    return "You'r group not admin";
}

 

수정 사항

1. 사용자 권한 변경 트랜잭션 추가

2. 주석 추가